为什么阻止?我知道Dispatcher.PushFrame()的解决方案,但仍然。这是经典的“不要阻止异步代码”类型的问题吗?
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);
}
答案 0 :(得分:2)
我尝试使用此代码,它可以正常工作。问题是Dispatche
如何工作,我认为它需要一个没有停止但没有睡眠的线程,并且不会忙于运行其他代码。
static Dispatcher dispatcher;
static void Main(string[] args)
{
dispatcher = Dispatcher.CurrentDispatcher;
Task.Run(async () => await Test()); //.Wait();
while (true)
{
Dispatcher.PushFrame(new DispatcherFrame());
}
}
static async Task Test()
{
//var dispatcher = Dispatcher.CurrentDispatcher;
var t = Task.Run(() =>
{
Console.WriteLine(dispatcher.Thread.ThreadState);
dispatcher.Invoke(() =>
{
Console.WriteLine("works");
});
});
await t; ;
}