在同步方法中调用异步方法,对于有返回结果的需要Result,没有返回结果的需要wait
先看一下特殊代码,下面的代码会死锁,知道为什么吗?
private void Test()
{
var message = GetMessageAsync().Result ;
Console.WriteLine(message);
}
private async Task<string> GetMessageAsync()
{
await Task.Delay(1);
return "Hello World!";
}
上述代码执行会卡死,
1.Result 会阻塞当前线程
2.await Task.Delay(1) 需要返回到原始的同步上下文继续执行
3.但原始线程被 .Result 阻塞了,无法处理回调
结果:任务永远无法完成,线程永远被阻塞
下面我们稍微修改一下代码,就不会卡死
private void Test()
{
var message = GetMessageAsync().Result ;
Console.WriteLine(message);
}
private async Task<string> GetMessageAsync()
{
await Task.Delay(1).ConfigureAwait(false);
return "Hello World!";
}
变动的地方是增加ConfigureAwait(false)的调用,false代表是可以由其它线程来执行,true则是必须由原来的线程回到这里执行。
以上是调用有返回结果的异步方法,下面的示例是调用无返回值的方法
private void Test()
{
try
{
FooAsync().Wait();
Console.WriteLine("Hello World!");
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
private async Task FooAsync()
{
await Task.Delay(1).ConfigureAwait(false);
}
在调用方法后增加wait方法的调用
2252

被折叠的 条评论
为什么被折叠?



