使用同步上下文和任务调度以及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;
        }

 

posted @ 2021-07-23 14:51  龙骑科技  阅读(78)  评论(0编辑  收藏  举报