2011-07-15 39 views
5

我想用調度程序創建第二個線程,這樣我就可以使主調度程序(用於UI)完全無壓力,並使UI不斷響應。.NET創建新的調度程序

現在,我可以爲每個子(或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

確保CheckLoopThread不啓動它後立即結束(如果線程運行並不需要很長時間來執行CheckLoop程序)。 –

+0

檢查循環有一個循環,它不會結束。 –

回答

10

Dispatcher.FromThread不會創建分派器,並且如果尚未爲該線程創建分派器,將返回空值。要爲線程創建分派器,您必須至少在CheckLoopThread上訪問Dispatcher.CurrentDispatcher一次。因爲它說,在MSDN上爲Dispatcher.CurrentDispatcher

如果調度不與當前線程關聯,一個新的 調度將被創建。 FromThread 方法不是這種情況。 FromThread將返回null如果沒有調度員 與指定線程關聯

+0

非常感謝!確實是這樣。 +1爲你。 –

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(...); 

看起來很複雜,所有鎖定都很複雜,但理論上012th方法可以在實際設置dispatcher之前返回,因此調用此方法可能會導致沒有鎖定的NullReferenceException

+0

這是爲我做的。謝謝! – aclave1

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(...); 
+1

非常真實,雖然我不確定底層實現是否相同。 – mycroes