.NET创建新的调度程序

Ren*_*ers 6 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)
Run Code Online (Sandbox Code Playgroud)

但是,变量"Test"在执行"Nothing"之后.这怎么可能?是另一种创建第二个调度程序的方法吗?

答案在任何.NET表单中都很受欢迎.Visual Basic或C#.我在.NET 4.0框架上使用VB.NET WPF.

提前致谢.

Jak*_*sen 10

Dispatcher.FromThread如果尚未为该线程创建Dispatcher,则不会创建Dispatcher并返回null.要为线程创建Dispatcher,您必须Dispatcher.CurrentDispatcher至少访问一次CheckLoopThread.正如它在MSDN上所说Dispatcher.CurrentDispatcher:

如果Dispatcher未与当前线程关联,则将创建新的Dispatcher.FromThread方法不是这种情况.如果没有与指定线程关联的调度程序,则FromThread将返回null


Jer*_*gen 8

锁定为什么?

我更喜欢:

Dispatcher myDispatcher = null;

ManualResetEvent dispatcherReadyEvent = new ManualResetEvent(false);

new Thread(new ThreadStart(() =>
{
    myDispatcher = Dispatcher.CurrentDispatcher;
    dispatcherReadyEvent.Set();
    Dispatcher.Run();
})).Start();

dispatcherReadyEvent.WaitOne();

myDispatcher.Invoke(...);
Run Code Online (Sandbox Code Playgroud)


myc*_*oes 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(...);
Run Code Online (Sandbox Code Playgroud)

所有锁定似乎都很复杂,但理论上该Start()方法可以在dispatcher实际设置之前返回,因此调用它可能会导致NullReferenceException没有锁定.