使用同步上下文和任务调度以及async和await语法糖
使用同步上下文和任务调度以及async和await语法糖
private static readonly HttpClient s_httpClient = new HttpClient(); private static readonly WebClient s_WebClientClient = new WebClient(); /// <summary> /// 测试ConfigureAwait /// </summary> public static async void TestConfigureAwait() { string text2 = await s_httpClient.GetStringAsync("https://www.baidu.com/").ConfigureAwait(true);//默认,进行上下文交互,下面的代码会交给同步上下文去执行,如果设置ConfigureAwait(false)了,下面的代码不会再同步上下文中处理了。 string text = await s_httpClient.GetStringAsync("https://www.baidu.com/").ConfigureAwait(false); //ConfigureAwait(false)设置成false时,获取的数据不正确,会有bug的 // bug //downloadBtn.Content = text; Console.WriteLine($"HttpClient获取的值 :{text}"); //假设,bnttxt是窗体按钮,点击按钮之后获取信息,之后更新按钮显示文本 //使用三种回调方式 string bnttxt = null; //1、使用回调---使用TaskScheduler获取的同步上下文进行回调 _ = s_httpClient.GetStringAsync("https://www.baidu.com/").ContinueWith(taskstr => { bnttxt = taskstr.Result; }, TaskScheduler.FromCurrentSynchronizationContext()); //2、使用回调---同步上下文 var currentSynchronizationContext = System.Threading.SynchronizationContext.Current; _ = s_httpClient.GetStringAsync("https://www.baidu.com/").ContinueWith(taskstr => { currentSynchronizationContext.Post(a => { bnttxt = taskstr.Result; }, null); }, CancellationToken.None); //3、使用回调---使用async/await语法糖 var result = await s_httpClient.GetStringAsync("https://www.baidu.com/"); bnttxt = result; }
龙腾一族至尊龙骑