为什么要等待阻塞Dispatcher.Invoke?

时间:2017-09-22 09:52:45

标签: c# asynchronous async-await dispatcher

为什么阻止?我知道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);
    }

1 个答案:

答案 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; ;
}