探究SynchronizationContext在.Net异步编程中的地位
原文: 探究SynchronizationContext在.Net异步编程中的地位 引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供 Task线程包装类 和 await/async异步编程语法糖 简化了异步编程方式。 相信很多开发者都看到如下异步编程实践原则: 实践原则 说明 例外情况 ① 避免 Async Void 最好使用 async Task 方法而不是 async void 方法 事件处理程序 ② 始终使用 await 不要混合阻塞式代码和异步代码 控制台 main 方法 ③ 配置上下文 尽可能使用ConfigureAwait(false) 需要上下文的方法 遵守以上冷冰冰的②③条的原则,可保证异步程序按照预期状态正常运作;我们在各大编程论坛常看到违背这2条原则引发的莫民奇妙的死锁问题。 UI 例子: 点击按钮触发了一个远程HTTP请求,用请求的返回值修改UI控件, 以下代码会引发deadlock (类似状态出现在Windows Form、WPF) public static async Task<JObject> GetJsonAsync(Uri uri) { using ( var client = new HttpClient()) { var jsonString = await client