虽然 Zaches 的回答是完全有效的(也是我使用了一段时间的方法),但我偶然发现了我认为更优雅的解决方案Dispatcher
:
创建工作线程:
Dispatcher _workerDispatcher;
Thread _workerThread = new Thread(new ThreadStart(() =>
{
_workerDispatcher = Dispatcher.CurrentDispatcher; // Required to create the dispatcher
Dispatcher.Run(); // Keeps thread alive and creates a queue for work
});
_workerThread.Start();
将工作放入工作线程(从主线程或另一个线程):
// Synchronous work
_workerDispatcher.Invoke(() =>
{
// Do stuff
});
// Asynchronous work (makes most sense for background work)
_workerDispatcher.BeginInvoke(() =>
{
// Do stuff
});
关闭工作线程:
_workerDispatcher.InvokeShutdown();
_workerThread.Join(); // Wait for thread to shut down
我使用new Thread()
是因为我需要设置公寓状态,但您也可以使用使用Task.Run()
and创建的任务Task.Factory.StartNew()
。
我不是 100% 确定有必要调用thread.Join()
,但我宁愿确定线程已被关闭。如果您使用的是Task
呼叫task.Wait()
。
获取 a 的另一种方法Dispatcher
是调用,但重要的是Dispatcher.FromThread(thread)
要注意 a在使用之前不会创建(即使您以后不使用引用)。Dispatcher
CurrentDispatcher
这种方法的一个缺点是它不能用于让多个线程从队列中挑选项目并进行工作 - 因为您将不得不使用 Zaches 回答中描述的生产者/消费者。调度程序方法允许您在特定主题中排队工作。