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
}
我将更详细和详细地解释这种僵局情况