C# 为什么等待块调度程序调用?

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()

为什么它会阻塞?我知道Dispatcher.PushFrame()的解决方案,但仍然是。这是一个典型的“不阻塞异步代码”类型的问题吗

UPD:现在它在主线程上同步等待,并使用threadpool dispatcher和still块

    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
不起作用,因为当u
await
时,当前正在运行的线程需要“暂停”并将此线程释放到线程池(不是每次都发生,只有在切换线程时才会发生,在这种情况下:
Task.Run
),这会导致dispatcher无法运行,因为等待的方法永远不会结束。是的,谢谢你,这会起作用,我们有一个基于PushFrame的解决方案。只是想知道为什么等待不起作用。
await
不起作用,因为当u
await
时,当前正在运行的线程需要“暂停”并将此线程释放到线程池(不是每次都发生,只有在切换线程时才会发生,在这种情况下:
Task.Run
),这会导致dispatcher无法运行,因为等待方法永远不会结束。