关于异步await async

MYsce 2019-07-31 06:17:39

为什么在winfrom 下面 这段代码会卡死界面,得不到返回结果,一直卡死。。在控制台程序可以得到结果
虽然Task.Run里面的方法执行完,但是后续的代码不会被执行一直卡着。。为什么呢?

private async Task<int> GetTotalCount()
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
int res = 0;
await Task.Run(() =>
{
for (int k = 0; k < 10; k++)
{
res += k;

}

});
Console.WriteLine("运算结束");
return res;

}




 private void Button1_Click(object sender, EventArgs e)
{
var res= GetTotalCount().Result;
MessageBox.Show(res.ToString());
}
...全文
138 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2019-07-31
  • 打赏
  • 举报
回复
GetTotalCount().Result; 这个等于同步,所以他当然等着
github_36000833 2019-07-31
  • 打赏
  • 举报
回复


// 卡死的原因解释:

        private async Task<int> GetTotalCount()
        {
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
            int res = 0;

            // b.这里的await捕获的是UI线程的同步上下文
            await Task.Run(() =>
            {
                for (int k = 0; k < 10; k++)
                {
                    res += k;

                }
            });

            // c.这里回到捕获的上下文,会在UI线程执行,却由于a而永远得不到机会。
            Console.WriteLine("运算结束");
            return res;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            var res = GetTotalCount().Result;  // a.阻塞UI线程
            MessageBox.Show(res.ToString());
        }
解决死锁的另一种方法,就是不让await后回到捕获UI线程的同步上下文,比如 await Task.Run(() => { for (int k = 0; k < 10; k++) { res += k; } }).ConfigureAwait(false); // 这样也可以避免死锁。
MYsce 2019-07-31
  • 打赏
  • 举报
回复
引用 1 楼 github_36000833 的回复:
var res= GetTotalCount().Result; 会阻塞。可以改成 private async void Button1_Click(object sender, EventArgs e) { var res= await GetTotalCount(); MessageBox.Show(res.ToString()); }
谢谢,你的方法可以的,但是我的方法为什么会这样不是等待GetTotalCount 里面的await 结束就可以继续吗?
github_36000833 2019-07-31
  • 打赏
  • 举报
回复
var res= GetTotalCount().Result; 会阻塞。可以改成 private async void Button1_Click(object sender, EventArgs e) { var res= await GetTotalCount(); MessageBox.Show(res.ToString()); }

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧