我试图重现一个像这个例子中的死锁情况:
https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
这是我在控制台应用程序中运行的代码:
class Program
{
static async Task<int> f()
{
var t = Task.Delay(1000); //and not Task.Delay(1000).ConfigureAwait(false);
await t;
return 1; // line execute in a woker thread
}
static async Task g()
{
int p=await f();
}
static void Main(string[] args)
{
var t=g(); //0
t.Wait();
}
}
这段代码不阻塞:返回1在另一个线程中执行,虽然我还没写过Task.Delay(1000).ConfigureAwait(false);
但是这个wpf应用程序有一个僵局,因为我已经预见到了:
<Application x:Class="WpfApplication3.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication3"
Startup="Application_Startup">
<Application.Resources>
</Application.Resources>
public partial class App : Application
{
public async Task<int> f()
{
var t = Task.Delay(1000)
await t;
return 1;
}
public async Task g()
{
int p = await f();
a = 1 + p;
}
private void Application_Startup(object sender, StartupEventArgs e)
{
var t = g();
t.Wait();
}
}
我不明白为什么控制台应用程序在没有死锁的情况下工作但是wpf应用程序有死锁。
谢谢您的帮助
来自https://blogs.msdn.microsoft.com/pfxteam/2012/01/20/await-synchronizationcontext-and-console-apps/:
SynchronizationContext.Current
在控制台应用程序中为空,从而避免了Stephen Cleary在帖子中描述的死锁。