2011-01-31 43 views
2

我無法找到一個C#示例,說明如何提高在以下條件的跨線程事件:提高2個線程之間的事件,當兩個線程是一個WinForm

比方說,我有1事件及3主題:

事件DoStuff

線程A - WinForm的

線程B - 線程線程A催生做一些處理。已被預訂DoStuff

線程C-函數foo() - 線程,線程B催生做一些定子處理和引發事件DoStuff現在

如何確保線程C-引發的事件被處理線程B內部而不是C或A.

我運行的所有示例都是針對Form/Control.Invloke提示的,或者是那種類型的東西,我真的想要擁有任何Thread實際訂閱的事件執行它是重要的線程內部,而不僅僅是主窗體線程。

+0

爲什麼使用事件而不是僅加入或使用工作線程池? – JohnOpincar 2011-01-31 17:10:05

+0

線程不處理事件,方法。也許你可以解釋一下你需要什麼,有人可以提出一個替代方案。 – 2011-01-31 17:23:47

回答

4

從一個線程處理一個調用具體的其他線程是非常平凡的。不可能任意中斷線程並使其執行一些代碼。這會導致可怕的重入問題。試圖用信號量來防止這種情況將會導致死鎖。

目標線程必須合作,它必須是「空閒」的,並且不會主動地改變程序的狀態。一個常見的機制是線程安全的隊列。事件提升線程將請求放入隊列中,目標線程需要一個循環來讀取隊列中的請求並執行它們。也許這聽起來很熟悉,是的,這就是程序的UI線程工作的方式。