我正在尝试使用调度程序创建第二个线程,以便我可以让主调度程序(对于UI)完全没有压力,并且让UI不断响应。
现在,我可以为每个sub(或C#中的void)创建多个线程,但是我不可能创建一个新线程并抓住它的调度程序,并调用它吗?这就是我所做的:
Private CheckLoopThread As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf CheckLoop))
CheckLoopThread.Priority = System.Threading.ThreadPriority.Lowest
CheckLoopThread.Start()
Dim Test As Windows.Threading.Dispatcher = Windows.Threading.Dispatcher.FromThread(CheckLoopThread)
但是,变量“Test”在执行“Nothing”之后。这怎么可能?是另一种创建第二个调度程序的方法吗?
在任何.NET表单中都可以理解答案。 Visual Basic或C#。我在.NET 4.0框架上使用VB.NET WPF。
提前致谢。
答案 0 :(得分:10)
Dispatcher.FromThread
将不会创建Dispatcher并返回null。要为线程创建Dispatcher,您必须至少在CheckLoopThread
上访问Dispatcher.CurrentDispatcher
一次。正如MSDN上Dispatcher.CurrentDispatcher
所述:
如果Dispatcher未与当前线程关联,则为新线程 将创建调度程序。 FromThread不是这种情况 方法。如果没有调度程序,FromThread将返回null 与指定的线程相关联
答案 1 :(得分:7)
为什么要锁定?
我更喜欢:
Dispatcher myDispatcher = null;
ManualResetEvent dispatcherReadyEvent = new ManualResetEvent(false);
new Thread(new ThreadStart(() =>
{
myDispatcher = Dispatcher.CurrentDispatcher;
dispatcherReadyEvent.Set();
Dispatcher.Run();
})).Start();
dispatcherReadyEvent.WaitOne();
myDispatcher.Invoke(...);
答案 2 :(得分:5)
我实际上创建了很多这些调度程序,我想正确的方法是以下几点:
object theLock = new object();
Dispatcher dispatcher = null;
lock (theLock)
{
new Thread(new ThreadStart(() =>
{
lock (theLock)
{
dispatcher = Dispatcher.CurrentDispatcher;
Monitor.Pulse(theLock);
}
Dispatcher.Run();
})).Start();
Monitor.Wait(theLock);
}
dispatcher.Invoke(...);
所有锁定似乎都很复杂,但理论上Start()
方法可以在实际设置dispatcher
之前返回,因此调用它可能会导致NullReferenceException
没有锁定