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
锁定为什么?
我更喜欢:
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)
我实际上创建了很多这些调度程序,我想正确的方法是以下几点:
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没有锁定.
| 归档时间: |
|
| 查看次数: |
6804 次 |
| 最近记录: |