C# 为什么等待块调度程序调用?
为什么它会阻塞?我知道Dispatcher.PushFrame()的解决方案,但仍然是。这是一个典型的“不阻塞异步代码”类型的问题吗 UPD:现在它在主线程上同步等待,并使用threadpool dispatcher和still块C# 为什么等待块调度程序调用?,c#,asynchronous,async-await,dispatcher,C#,Asynchronous,Async Await,Dispatcher,为什么它会阻塞?我知道Dispatcher.PushFrame()的解决方案,但仍然是。这是一个典型的“不阻塞异步代码”类型的问题吗 UPD:现在它在主线程上同步等待,并使用threadpool dispatcher和still块 static void Main(string[] args) { Task.Run(async() => await Test()).Wait(); } static async Task Test()
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);
}
我尝试了这段代码,它成功了。问题是
dispatch
如何工作,我认为它需要一个不停止、不休眠、不忙于运行其他代码的线程
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; ;
}
我尝试了这段代码,它成功了。问题是
dispatch
如何工作,我认为它需要一个不停止、不休眠、不忙于运行其他代码的线程
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; ;
}
`Test().Wait();`因为
Wait()
不等待在后台线程上运行的任务,所以当Wait
发生时,主线程被阻塞,所以每个线程都被阻塞。OK,我可以重新设置示例的范围,现在我在主线程上同步等待,使用线程池中的调度程序时: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”);})});Wait t.ConfigureAwait(false);}此测试代码没有功能分派器。Application.Run()调用对于允许它执行需要执行的操作至关重要。忽略此需求只会产生死锁。`Test().Wait();`因为Wait()
不等待在后台线程上运行的任务,所以当Wait
发生时,主线程被阻塞,所以每个线程都被阻塞。OK,我可以重新设置示例的范围,现在我在主线程上同步等待,使用线程池中的调度程序时: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”);})});Wait t.ConfigureAwait(false);}此测试代码没有功能分派器。Application.Run()调用对于允许它执行需要执行的操作至关重要。忽略这一需求只会产生死锁。是的,感谢这将起作用,我们有一个基于PushFrame的解决方案。只是想知道为什么等待不起作用。await
不起作用,因为当uawait
时,当前正在运行的线程需要“暂停”并将此线程释放到线程池(不是每次都发生,只有在切换线程时才会发生,在这种情况下:Task.Run
),这会导致dispatcher无法运行,因为等待的方法永远不会结束。是的,谢谢你,这会起作用,我们有一个基于PushFrame的解决方案。只是想知道为什么等待不起作用。await
不起作用,因为当uawait
时,当前正在运行的线程需要“暂停”并将此线程释放到线程池(不是每次都发生,只有在切换线程时才会发生,在这种情况下:Task.Run
),这会导致dispatcher无法运行,因为等待方法永远不会结束。