【问题标题】:Is there a clean way of using Dispatcher in a .NET Console application?有没有在 .NET 控制台应用程序中使用 Dispatcher 的干净方法?
【发布时间】:2015-08-26 07:05:47
【问题描述】:

在 .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(...)
    }
}

我在这里所做的基本上是获取主线程的调度程序,我称之为mainSerialQueue,然后创建另一个线程,并为其获取调度程序,我称之为backgroundSerialQeueue。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    还有一件事 - async、await 也是建立在 SynchorinzationContext 之上的。

    【讨论】:

      猜你喜欢
      • 2011-12-24
      • 2023-03-15
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 2019-10-13
      • 2013-01-24
      • 2013-05-16
      • 1970-01-01
      相关资源
      最近更新 更多