在.NET控制台应用程序中使用Dispatcher是否有一种干净的方法?

时间:2015-08-26 07:05:47

标签: c# .net command-line-interface dispatcher

在.NET(C#)应用程序中,我希望有一个调度程序系统,类似于iOS上的dispatch_async()。

我在多个stackoverflow线程上读到,Dispatcher只应在WPF应用程序的上下文中使用,但我不明白为什么。

我通过阅读MSDN文档编写了以下代码,它正在运行。 我有什么理由不再使用这种机制吗?

我不想在后来的过程中意识到我因为我不知道的事情而陷入困境。 (我是C#和.NET的新手。)

using System;
using System.Threading;
using System.Windows.Threading;


namespace ExcelLeak
{
    class Program
    {
        public static Dispatcher mainSerialQueue;
        public static Dispatcher backgroundSerialQeueue;

        static void Main(string[] args)
        {

            mainSerialQueue = Dispatcher.CurrentDispatcher;
            Thread serialQueueThread = new Thread(() =>
            {

                backgroundSerialQeueue = Dispatcher.CurrentDispatcher;
                mainSerialQueue.BeginInvoke((System.Action)(() =>
                {
                    doSomeWork();

                }));
                Dispatcher.Run();
            });
            serialQueueThread.Start();
            Dispatcher.Run();
        }
    }

    public static void doSomeWork() {
        mainSerialQueue.BeingInvoke(...)
    }
}

我在这里做的基本上是获取主线程的Dispatcher,我称之为mainSerialQueue,然后创建另一个线程,并获取它的Dispatcher,我称之为backgroundSerialQeueue

1 个答案:

答案 0 :(得分:0)

每当需要在特定线程上调用代码时 - 使用相应线程的SynchronizationContext。对于控制台应用程序上下文为空,因此您需要初始化它。 2个简单的方法是:

  • 在内部使用WPF调度程序实现SynchorinzationContext,并通过SynchronizationContext.SetSynchronizationContext设置所需线程的上下文

  • 如果System.Windows.Forms.Form类和SynchorinzationContext将在执行线程时自动初始化,则创建实例

为什么不直接使用Dispatcher?如果您稍后会发现线程问题和问题,那么您只需要修复SynchorinzationContext。至少你可以在建议的方法之间切换。或者您可以编写自己的上下文,但怀疑是否需要它。

还有一件事 - 异步,等待也建立在SynchorinzationContext上。