【发布时间】:2014-01-28 08:08:32
【问题描述】:
试图理解为什么 .NET 以他们的方式实现 async-await。
当更改一段简单的代码以使用 async-await 时,似乎最不需要的工作就是使用 async-await 指令标记调用和被调用的方法:
private async void OnGuiClick(object sender, EventArgs args)
{
textBox1.Text = await Work();
}
private async Task<string> Work()
{
await Task.Delay(2000);
return "Result";
}
为什么.NET 坚持两者? 即用一个关键字指定一个表达式会很好,必须立即在工作线程上异步评估表达式 - 而调用 GUI 线程被释放以执行其他任务,但将再次连接以执行剩余代码一次工作线程完成。
是否有更简单或更好的方法来分配工作线程来处理 Work 方法,然后自动(无需求助于 Invoke(...))确保相同的调用 GUI 线程处理结果? 为什么不这样:
private void OnGuiClick(object sender, EventArgs args)
{
textBox1.Text = <'some async directive'> Work();
}
private string Work()
{
Thread.Sleep(2000);
return "Result";
}
(MSDN documentation 声明如果目标不包含 await 语句,编译器将同步执行代码 - 但那有什么意义呢? - 当然 await async 关键字仅用于异步使用。那为什么要这样做复杂,而不是使用单个指令?)
【问题讨论】:
-
Eric Lippert 不久前发布了一篇不错的blog post,可能值得一读,也就是说:“方法上的“异步”修饰符并不意味着“此方法会自动安排在工作线程异步””和“异步方法的全部意义在于您尽可能地留在当前线程上。”
-
谢谢 - 那篇文章真的很有帮助:await 不创建工作线程,它使用当前线程。而且 async 不保证异步实现(即使编译器会发出警告),由开发人员确保 async 方法正确异步。
-
@StephenCleary,部分同意 - 但我真正的问题与指示的 SO 主题不同。本主题中的其他建议和解释很有帮助,但我真正想要的在下面对您的回答的评论中有所描述
标签: c# asynchronous async-await