所以我在问这个问题,async
我认为这只是一个糖语法:
Task<..>...ContinueWith...
最后检查Result
财产。
我什至在这里问了一个问题,我被告知:
但是今天我被 Jon Skeet 纠正了
“离那还有很长的路要走”。
那么这两种方法之间的核心区别是什么?
所以我在问这个问题,async
我认为这只是一个糖语法:
Task<..>...ContinueWith...
最后检查Result
财产。
我什至在这里问了一个问题,我被告知:
但是今天我被 Jon Skeet 纠正了
“离那还有很长的路要走”。
那么这两种方法之间的核心区别是什么?
它正在添加一个延续 - 但是手动构建该延续可能非常痛苦,因为需要携带有关我们到达哪里以及本地状态是什么的所有信息。
作为一个非常简单的示例,我建议您尝试提出与此异步方法等效的方法:
public static async Task<int> SumTwoOperationsAsync()
{
var firstTask = GetOperationOneAsync();
var secondTask = GetOperationTwoAsync();
return await firstTask + await secondTask;
}
// These are just examples - you don't need to translate them.
private async Task<int> GetOperationOneAsync()
{
await Task.Delay(500); // Just to simulate an operation taking time
return 10;
}
private async Task<int> GetOperationTwoAsync()
{
await Task.Delay(100); // Just to simulate an operation taking time
return 5;
}
真的试着想出相当于第一种方法。我想你会发现它需要相当多的代码——尤其是如果你真的每次都想回到一个合适的线程。(例如,想象一下该异步方法中的代码也修改了 WPF UI。)哦,请确保如果其中任何一个任务失败,您返回的任务也会失败。(如果第一个任务也失败了,异步方法实际上会“错过”第二个任务的失败,但这是一个相对较小的问题 IMO。)
接下来,如果您需要方法中的try
/等价物,请弄清楚您需要如何更改代码。同样,这会使非异步方法更加复杂。这一切都可以做到,但它是在脖子上的痛苦。finally
async
所以是的,它“只是”语法糖。也是如此foreach
。for
循环(或任何其他类型的循环)也是如此。在async
/的情况下await
,它是语法糖,可以做很多事情来转换你的代码。
有很多关于异步的视频和博客文章,我希望仅仅观看/阅读其中的一些文章就能让你有足够的洞察力来理解这远非一个小调整:它从根本上改变了编写大文件的实用性大量的异步代码正确。
此外,基于模式的 async/await不仅适用于Task
/ Task<T>
。您可以等待符合可等待模式的任何内容。实际上,很少有开发人员需要自己实现该模式,但它允许Task.Yield
返回 aYieldAwaitable
而不是任务之类的方法。