首页 > 其他 > 详细

async await 死锁简单分析

时间:2020-07-04 19:23:46      阅读:62      评论:0      收藏:0      [点我收藏+]

虽然写了很多asyncawait代码,有时候由于一些原因,还是发生了死锁,所以这次就简单的分析下。

死锁代码

        private void Button_Click(object sender, EventArgs e)
        {
            var jsonTask = GetJsonAsync(new Uri("https://www.yishasoft.com/admin/SystemManage/DataDict/GetDataDictListJson"));
            string result = jsonTask.Result.ToString(); // 步骤1.主线程在这里被 jsonTask.Result 阻塞,直到 jsonTask 完成
        }

        public static async Task<JObject> GetJsonAsync(Uri uri)
        {
            // 步骤2.当前所在的线程是主线程
            using (var client = new HttpClient())
            {
                var jsonString = await client.GetStringAsync(uri);
                // 步骤3.GetStringAsync 执行完成后,返回步骤2所在的线程(主线程),但是主线程在步骤1已经被阻塞
                return JObject.Parse(jsonString);
            }
        }

 

改进一,加上 ConfigureAwait(false)

        private void Button_Click(object sender, EventArgs e)
        {
            var jsonTask = GetJsonAsync(new Uri("https://www.yishasoft.com/admin/SystemManage/DataDict/GetDataDictListJson"));
            string result = jsonTask.Result.ToString(); // 步骤1.主线程在这里被 jsonTask.Result 阻塞,直到 jsonTask 完成
        }

        public static async Task<JObject> GetJsonAsync(Uri uri)
        {
            // 步骤2.当前所在的线程是主线程
            using (var client = new HttpClient())
            {
                var jsonString = await client.GetStringAsync(uri).ConfigureAwait(false);
                // 步骤3.GetStringAsync 执行完成后,根据ConfigureAwait(false),此行后面的代码不返回到步骤2所在的线程(主线程)
                return JObject.Parse(jsonString);
            }
        }

 

改进二,使用标准写法

        private async void Button_Click(object sender, EventArgs e)
        {
            var jsonTask = await GetJsonAsync(new Uri("https://www.yishasoft.com/admin/SystemManage/DataDict/GetDataDictListJson")); // 步骤1.这种写法,主线程不会被阻塞
            string result = jsonTask.ToString();
        }

        public static async Task<JObject> GetJsonAsync(Uri uri)
        {
            // 步骤2.当前所在的线程是主线程或者是其他线程
            using (var client = new HttpClient())
            {
                var jsonString = await client.GetStringAsync(uri);
                // 步骤3.GetStringAsync 执行完成后,后面的代码返回到步骤2所在的线程
                return JObject.Parse(jsonString);
            }
        }

 

 

async await 死锁简单分析

原文:https://www.cnblogs.com/lhking/p/13235826.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!