C# 同步上下文

0a000632e1a06ea1ce37650ffccdaa8a.png

如果验证方法中使用的线程,会发现 CallerWithAsync 方法、CallerWithAwaiter 方法和 CallerWithContinuationTask 方法,在方法的不同生命阶段使用了不同的线程。一个线程用于调用 GreetingAsync 方法,另外一个线程执行 await 关键字后面的代码,或者继续执行 ContinueWith 方法内的代码块。

使用一个控制台应用程序,通常不会有什么问题。但是,必须保证在所有应该完成的后台任务完成之前,至少有一个前台线程仍然在运行。示例应用程序调用Console.ReadLine 来保证主线程一直在运行,直到按下返回键。

为了执行某些动作,有些应用程序会绑定到指定的线程上(例如,在 WPF 或Windows 应用程序中,只有 UI 线程才能访问 UI 元素),这将会是一个问题。

如果使用 async 和 await 关键字,当 await 完成之后,不需要进行任何特别处理,就能访问 UI 线程。默认情况下,生成的代码会把线程转换到拥有同步上下文的线程中。WPF 应用程序设置了 DispatcherSynchronizationContext 属性,Windows Forms 应用程序设置了 WindowsFormsSynchronizationContext属性。Windows 应用程序使用 WinRTSynchronizationContext。如果调用异步方法的线程分配给了同步上下文,await 完成之后将继续执行。默认情况下,使用了同步上下文。如果不使用相同的同步上下文,则必须调用 Task 方法 ConfigureAwait(continueOnCapturedContext:false)。例如,一个 Windows 应用程序,其 await 后面的代码没有用到任何的 UI 元素。在这种情况下,避免切换到同步上下文会执行得更快。

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全 

往期推荐

·  C# 数据流

·  C# 类型系统

·  C# 面向对象的编程

·  C# 执行 SQL 语句

·  C# 连接数据库

·  C# 迭代器

a5b0e233efe1ccb2ac3f84eb6355c81b.png

Love life,love yourself

关注小编不迷路呦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值