在.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
。
答案 0 :(得分:0)
每当需要在特定线程上调用代码时 - 使用相应线程的SynchronizationContext。对于控制台应用程序上下文为空,因此您需要初始化它。 2个简单的方法是:
在内部使用WPF调度程序实现SynchorinzationContext,并通过SynchronizationContext.SetSynchronizationContext设置所需线程的上下文
如果System.Windows.Forms.Form类和SynchorinzationContext将在执行线程时自动初始化,则创建实例
为什么不直接使用Dispatcher?如果您稍后会发现线程问题和问题,那么您只需要修复SynchorinzationContext。至少你可以在建议的方法之间切换。或者您可以编写自己的上下文,但怀疑是否需要它。
还有一件事 - 异步,等待也建立在SynchorinzationContext上。