C# 带和不带异步修饰符的异步方法

C# 带和不带异步修饰符的异步方法,c#,async-await,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; })

方法
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);
}
private async Task Add1(int a,int b)
{
返回等待任务。运行(
() =>
{
睡眠(1000);
返回a+b;
});
}
专用任务地址2(内部a、内部b)
{
返回任务。运行(
() =>
{
睡眠(1000);
返回a+b;
});
}
专用异步void UsageTest()
{
INTA=等待添加1(1,2);
int b=等待添加2(1,3);
}

Add1将同步运行,直到遇到wait关键字。在这种情况下,这不会产生效果,因为wait关键字位于方法的开头


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

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

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

差别也比较小,
Add1
将封送回其原始上下文,而
Add2
不会。如果调用代码不使用
wait
,则可能导致死锁:

public void Button1_Click(..)
{
  Add1().Wait(); // deadlocks
  Add2().Wait(); // does not deadlock
}
我将更详细和详细地解释这种僵局情况