2011-07-21 20 views
1
  1. 假設有一個線程A是一個UI線程。
  2. 線程A創建另一個線程B,它是一個非UI線程。
  3. 當線程B想要在線程A中引發一個事件時,所要做的就是 if(Form1.InvokeRequired)Form1.Invoke(同樣的方法)並在該方法中調用該事件的權利?

簡單。但是我的問題是如果你想做同樣的事情,如果A和B都是非UI線程呢? Theres沒有窗體對象從線程B調用Invoke()。如何在兩個非UI線程中模擬Control.Invoke()

如果WinForms應用程序執行此操作,爲什麼沒有類似於非UI線程的機制?我錯過了什麼嗎?有沒有類似的方法來從另一個非UI線程中引發一個非UI線程中的事件?

在此先感謝。

P.S.生產者/消費者模型的答案不是我在這裏尋找的。

回答

1

在第一種情況下,因爲線程B 知道它不是UI線程,還不如就叫.Invoke(...)

當有兩個非UI線程時,您將不得不使用某種消息傳遞/隊列。你不能只用中斷線程A來運行工作;你必須編寫線程A(例如)檢查一個工作隊列,出列一個項目並執行它。這幾乎是WinForms所做的,由Windows消息循環提供。不要緊,如果它不是你正在尋找的答案 - 這是它是什麼。

1

如果沒有UI,則不存在跨線程問題。所以只需從線程中調用它們即可。儘管你可能需要一些同步機制。

+0

線程問題不僅適用於用戶界面,當然; p就個人而言,我將問題解釋爲他希望線程A運行該工作,但我可能是錯誤的。 –

+0

嗯,你是對的馬克。必須確保WinForms在調用invoke時不會使用任何魔法來使事情發生。感謝您澄清我的疑惑。我會接受你的回答。它是Windows消息循環。 – Harindaka