方法Add1()
和Add2()
之间有什么区别?有什么不同吗?对于我所知道的所有用法(如方法UsageTest()
所示)是相同的。
private async Task<int> Add1(int a, int b)
{
return await Task.Run(
() =>
{
Thread.Sleep(1000);
return a + b;
});
}
private Task<int> Add2(int a, int b)
{
return Task.Run(
() =>
{
Thread.Sleep(1000);
return a + b;
});
}
private async void UsageTest()
{
int a = await Add1(1, 2);
int b = await Add2(1, 3);
}
答案 0 :(得分:6)
从语义上讲,它们实际上是等价的。
主要区别在于Add1
有更多开销(对于async
状态机)。
差异也较小; Add1
会将Add2
重新归结为其原始背景,而await
则不会。如果调用代码不使用public void Button1_Click(..)
{
Add1().Wait(); // deadlocks
Add2().Wait(); // does not deadlock
}
:
{{1}}
我更详细地解释了这种死锁情况on my blog和in a recent MSDN article。
答案 1 :(得分:1)
Add1将同步运行,直到遇到await关键字。在这种情况下,这将不起作用,因为await关键字位于方法的开头。
要查看其效果,可以将Thread.Sleep()方法插入到Add1和Add2的开头,并注意标记为async的方法在返回之前阻塞。