.NET创建新的调度程序

时间:2011-07-15 16:47:27

标签: vb.net multithreading dispatcher

我正在尝试使用调度程序创建第二个线程,以便我可以让主调度程序(对于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。

提前致谢。

3 个答案:

答案 0 :(得分:10)

如果尚未为该线程创建Dispatcher,

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没有锁定