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

时间:2013-06-07 15:30:30

标签: 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);
}

2 个答案:

答案 0 :(得分:6)

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

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

差异也较小; Add1会将Add2重新归结为其原始背景,而await则不会。如果调用代码不使用public void Button1_Click(..) { Add1().Wait(); // deadlocks Add2().Wait(); // does not deadlock }

,这可能会导致死锁
{{1}}

我更详细地解释了这种死锁情况on my blogin a recent MSDN article

答案 1 :(得分:1)

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

要查看其效果,可以将Thread.Sleep()方法插入到Add1和Add2的开头,并注意标记为async的方法在返回之前阻塞。