110,539
社区成员
发帖
与我相关
我的任务
分享
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());
}
// 卡死的原因解释:
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); // 这样也可以避免死锁。