async wait 的极简实现

For*_*ann 5 c# asynchronous async-await

尝试理解为什么 .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";
}
Run Code Online (Sandbox Code Playgroud)

为什么.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";
}
Run Code Online (Sandbox Code Playgroud)

MSDN文档指出,如果目标不包含await语句,编译器将同步执行代码 - 但这有什么意义? - 当然await async关键字仅用于异步使用。那为什么要使它如此复杂,而不是使用单个指令?)

dca*_*tro 4

你提出了一个很好的例子 - 我相信编译器只真正需要“await”关键字。我不认为它关心“async”修饰符。

然而,事实上,编译器坚持让你用“async”修饰符标记你的方法是一件好事——它允许你检查一个方法是否会同步/异步运行,而不必深入研究它的实现。它还告诉您是否必须/能够await这样做。我相信这些是强制使用两个关键字(而不仅仅是一个)的原因。

类似的情况是:为什么需要使用“public”访问修饰符来标记接口实现方法,即使它不能是私有/内部/受保护/受保护的内部?看起来多余吧?然而,它确实增加了可读性。