具有和不具有异步修饰符的异步方法

Goo*_*ide 4 c# async-await

方法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);
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 6

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

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

差异也较小; Add1将组织回到原来的背景,而Add2不会.如果调用代码不使用,这可能会导致死锁await:

public void Button1_Click(..)
{
  Add1().Wait(); // deadlocks
  Add2().Wait(); // does not deadlock
}
Run Code Online (Sandbox Code Playgroud)

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