4

方法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);
}
4

2 回答 2

6

从语义上讲,它们实际上是等价的。

主要区别在于Add1有更多开销(对于async状态机)。

也有较小的差异;Add1将封送回其原始上下文,而Add2不会。如果调用代码不使用,这可能会导致死锁await

public void Button1_Click(..)
{
  Add1().Wait(); // deadlocks
  Add2().Wait(); // does not deadlock
}

我在我的博客最近的 MSDN 文章中更详细地解释了这种死锁情况。

于 2013-06-07T15:43:07.517 回答
1

Add1 将同步运行,直到遇到 await 关键字。在这种情况下,这将不起作用,因为 await 关键字位于方法的开头。

要查看这样做的效果,您可以在 Add1 和 Add2 的开头插入一个 Thread.Sleep() 方法,并注意该方法在返回之前标记了 async 块。

于 2013-06-07T15:37:02.023 回答