非 UI 线程上的 WPF 调度程序

avo*_*avo 4 .net c# wpf multithreading begininvoke

根据 MSDN 的说法,它提供了管理线程工作项队列的服务。Dispatcher

一个简单的问题。我想仅用Dispatcher于此目的:作为工作项队列(通过发布Dispatcher.BeginInvoke),我的后台线程将以串行方式提供服务。

我不想让这个线程成为 STA 线程,也不需要在其上发送 Windows 消息。该线程上不会有 UI。

这是合法的使用方式吗Dispatcher

Ste*_*ary 5

这是使用 Dispatcher 的合法方式吗?

可以 将辅助线程与 a 一起使用Dispatcher,但这并不常见。通常这样做是为了让 UI 的不同部分在不同的 UI 线程上运行。调度程序线程将处理 Windows 消息,并且必须是 STA。此外,从技术上讲,处理并不是严格的 FIFO,因为已调度的项目按优先级排队。

也就是说,即使它不是设计为在没有 UI 的情况下使用的,您也可以这样使用它。

备择方案:

1)AsyncContextThread是一个简单的线程,带有来自我的 AsyncEx NuGet 库的工作队列:

private readonly AsyncContextThread _thread = new AsyncContextThread();
...
_thread.Factory.StartNew(() => { ... });
Run Code Online (Sandbox Code Playgroud)

AsyncContextThread类型SynchronizationContext为其运行的代码提供了 a ,因此async默认情况下,延续将在同一线程上恢复。

2)如果只关心请求是否被串行处理,而实际上它们在哪个线程上运行并不重要,那么您可以使用任务调度程序来指示线程池一次运行一个请求,如下所示:

private readonly TaskFactory _factory = new TaskFactory(
    new ConcurrentExclusiveSchedulerPair().ExclusiveScheduler);
_factory.StartNew(() => { ... });
Run Code Online (Sandbox Code Playgroud)