当前位置: 首页 > news >正文

微妙音门户网站建设宣传软文范例

微妙音门户网站建设,宣传软文范例,新型产品设计,医院的 建设网站的策划书.Net 中的同步上下文 【文 / 张赐荣】 什么是同步上下文? 同步上下文(SynchronizationContext)是一个抽象类,它提供了一个基本的功能,用于在不同的同步模型中传播一个同步操作。 同步上下文表示一个代码执行的位置&a…

.Net 中的同步上下文

【文 / 张赐荣】

什么是同步上下文?
同步上下文(SynchronizationContext)是一个抽象类,它提供了一个基本的功能,用于在不同的同步模型中传播一个同步操作。 同步上下文表示一个代码执行的位置,它可以将传递给它的Send或Post方法的委托调用到该位置。 Send方法是同步的,Post方法是异步的。
每个线程都可以有一个与之关联的同步上下文实例。可以通过调用静态方法SynchronizationContext.SetSynchronizationContext来将运行线程与一个同步上下文关联,也可以通过SynchronizationContext.Current属性来查询运行线程的当前同步上下文。
同步上下文并不一定代表一个特定的线程,它也可以将委托的调用转发到任何多个线程(例如,到一个线程池工作线程),或者(至少理论上)到一个特定的CPU核心,甚至到另一个网络主机。委托最终运行在哪里取决于使用的同步上下文的类型。

同步上下文的作用
同步上下文的目的是让公共语言运行时(CLR)的内部异步/同步操作能够在不同的同步模型中正确地工作。 这个模型也简化了托管应用程序在不同的同步环境中工作时必须遵循的一些要求。
例如,在Windows Forms应用程序中,只有一个主UI线程,它负责创建和更新窗体和控件。如果在其他线程上直接访问UI元素,就会导致异常或不一致的行为。因此,Windows Forms会在创建首个窗体的线程上安装一个WindowsFormsSynchronizationContext,它会将委托放到UI线程上执行。 这样,就可以在其他线程上异步地执行一些耗时或阻塞的操作,然后通过Post方法将结果传递给UI线程同步执行更新界面的操作。

同步上下文和异步编程
.NET提供了一些异步编程模式和语法糖,例如async/await、Task、TaskCompletionSource等,它们都依赖于同步上下文来实现正确和高效地异步操作。
当使用async/await编写异步代码时,编译器会将方法分割成两部分:第一部分是从方法开始到第一个await表达式之前的代码;第二部分是从第一个await表达式之后到方法结束的代码。第二部分被包装成一个委托,并传递给第一个await表达式所等待的任务(Task)作为其完成时要执行的续发。
当任务完成时,它会检查当前线程的同步上下文,并将委托调用到该同步上下文上。 这样,就可以保证异步续发在与原始方法相同的位置执行,例如在UI线程或请求线程上。这对于访问一些需要特定线程或上下文的资源是很有用的。
但是,有时候我们并不需要异步续发在原始方法的位置执行,而是希望它在默认的线程池上执行,以提高性能和并发度。这时候,我们可以使用ConfigureAwait方法来指定是否要捕获当前的同步上下文。例如:

var task = DoNavigationAsync ();
await task.ConfigureAwait (false); // 不捕获当前的同步上下文
MessageBox.Show (\"Navigation done!\"); // 可能在其他线程上执行

这样,异步续发就不会使用当前的同步上下文,而是使用默认的任务调度器(TaskScheduler.Default),它会将委托调用到一个线程池工作线程上。 这样做的好处是可以避免一些潜在的死锁或性能问题。
另一种异步编程模式是使用Task和TaskCompletionSource来创建和完成任务。Task表示一个异步操作的结果,它可以有三种状态:未完成、成功完成或失败完成。TaskCompletionSource是一个包装了一个任务的类,它提供了一种设置任务状态和结果的方法。
当我们使用TaskCompletionSource创建一个任务时,我们可以指定一个任务创建选项(TaskCreationOptions),其中有一个选项是HideScheduler,它表示不要从当前环境中获取任务调度器。 这样,当我们使用ContinueWith方法为任务添加续发时,就不会使用当前的同步上下文,而是使用默认的任务调度器。例如:

var tcs = new TaskCompletionSource<int> (TaskCreationOptions.HideScheduler);
var task = tcs.Task;
task.ContinueWith (t => Console.WriteLine (t.Result)); // 在线程池上执行
tcs.SetResult (42); // 完成任务

如果我们不指定HideScheduler选项,那么ContinueWith方法就会使用当前的同步上下文(如果存在)来执行续发。

总结
同步上下文是.NET中一个重要的概念,它影响了异步编程模式和语法的行为和效果。不同的.NET平台和环境实现了不同的同步上下文,以适应不同的同步模型。理解同步上下文的作用和用法,可以帮助我们编写正确和高效的异步代码。
 

http://www.yidumall.com/news/27836.html

相关文章:

  • 做拼团网站郑州seo
  • node.js可以做网站seo关键词排名优化品牌
  • 贵港网站设计上海企业推广
  • 深圳福田建设局网站首页十大营销模式
  • 政府网站建设存在问题app代理推广合作50元
  • 筛网怎么做网站网络营销文案策划
  • 为传销做网站自己网站怎么推广
  • 展馆设计总结茶叶seo网站推广与优化方案
  • ps做网站效果图制作过程榆林百度seo
  • 网站下载链接怎么做代做百度收录排名
  • 品牌建设 高质量发展seo搜索引擎优化求职简历
  • wordpress 社会化评论插件佛山百度快照优化排名
  • 怎么做网站投放adsense域名信息查询网站
  • 做前后端网站教程免费男女打扑克的软件
  • 山东省网站备案百度指数api
  • 哪种网站开发最简单营销方案
  • 左右网站模版推广app赚钱
  • python做网站 教育线上广告宣传方式有哪些
  • 辽阳网站建设北京百度推广排名优化
  • 有个在家做的客服网站国产十大erp软件
  • 网站建设开发维护企业网站制作模板
  • 中国工程机械网的官网seo是哪里
  • 深圳华强北电子市场汕头seo公司
  • vba可以做网站自动填网站制作平台
  • 做游戏代练去那个网站微信朋友圈营销文案
  • 做pc端网站多少钱东莞关键词优化推广
  • 网站备案帐户有什么用关键词优化最好的方法
  • 做个网站的价格今日中央新闻
  • 兰州网站建设lzwlxc手机优化器
  • 衡水的网站建设实时热搜