它为什么会阻止?我知道Dispatcher.PushFrame()的解决方案,但仍然如此。这是一个经典的“不要阻止异步代码”类型的问题吗?为什么等待块Dispatcher.Invoke?
class Program
{
static void Main(string[] args)
{
Test().Wait();
}
static async Task Test()
{
var disp = Dispatcher.CurrentDispatcher;
var t = Task.Run(() =>
{
disp.Invoke(() =>
{
Console.WriteLine("works");
});
});
await t.ConfigureAwait(false);
}
}
UPD:现在它在主线程上同步等待,并使用线程池调度程序并仍然阻塞。
static void Main(string[] args)
{
Task.Run(async() => await Test()).Wait();
}
static async Task Test()
{
var disp = Dispatcher.CurrentDispatcher;
var t = Task.Run(() =>
{
disp.Invoke(() =>
{
Console.WriteLine("works");
});
});
await t.ConfigureAwait(false);
}
https://stackoverflow.com/questions/13140523/await-vs-task-wait-deadlock – Legends
'测试()等待();'阻止不'await' –
因为'等待()'不会等待在后台线程上运行的任务,所以当'waiting'发生时,主线程被阻塞,所以每个阻塞都被阻塞 – John