【发布时间】:2015-03-24 11:20:59
【问题描述】:
我正在努力理解await 和async。
效果很好。但现在我陷入了僵局。
我用false 调用了ConfigureAwait,就像在this article 中一样,但我的代码仍然阻塞。
这是我的代码的一个小sn-p:
private void button1_Click(object sender, EventArgs e)
{
var result = HeavyWorkAsync().Result;
richTextBox1.AppendText(result);
}
private string HeavyWork()
{
for (var index = 0; index < 1000; index++)
{
Task.Delay(10).Wait();
}
return "finished";
}
private async Task<string> HeavyWorkAsync()
{
var task = await Task.Factory.StartNew<string>(HeavyWork).ConfigureAwait(false);
return task;
}
【问题讨论】:
-
你能解释一下为什么你不想做
await HeavyWorkAsync()吗? -
在我看来,这很丑。按钮的点击处理程序中的异步?
-
这是处理这种情况的推荐方法,最重要的是它不会阻塞或死锁:)
-
在上面?如果这不是死锁,就像文章中那样,这还能做什么?
-
async void处理这种情况是合法的。是的,async void很丑陋,应该在每个不是订阅事件的签名中避免使用,但我们别无选择,因为我们使用的 UI 框架不支持正确的异步回调。
标签: c# async-await deadlock