我有一個工人類和MainForm/UI類。在UI類中,我在新的後臺線程中創建了Worker類的新實例。這個線程將一些更新集中回UI控件。由於它們在不同的類中,我基本上將MainForm實例(this)和適當的委託傳遞給worker類的構造函數來更新控件。在構造函數中,我將mainForm設置爲一個ISynchronizeInvoke
對象(稱之爲_synch),然後在工作者類中進一步向下,我做了_synch.Invoke(theDelegate, new object[] { "new value" })
。ISynchronizeInvoke VS SynchronizationContext與mainForm.Invoke
這一切工作正常,但後來我意識到,它也可以做簡單的mainForm.Invoke
(不使用ISynchronizeInvoke
對象)。兩者有什麼區別?
更糟糕的是,我讀了一篇文章,認爲ISynchronizeInvoke
不再需要太多了,現在SynchronizationContext
已經很長了。我意識到我不明白這兩者是什麼。任何幫助理解爲什麼我應該使用這些對象的調用,而不是直接在mainForm上,將不勝感激。
ISynchronizeInvoke僅僅是有用的,做其他庫*不*有任何想法,這特別的線程是UI線程或如何正確調用來操縱UI代碼。從來沒有與類的問題,它*是用戶界面。並實現使ISynchronizeInvoke工作的管道。令人遺憾的是,WPF違反了合同,因此它不再是一個通用界面。 – 2014-09-24 16:45:35
@HansPassant感謝Hans。我嘗試按照Sriram的建議切換到'SynchronizationContext',但Send和Post不接受自定義代理。他們採用只有一個參數的SendOrPostCallback委託('object')。我當前的自定義委託具有值字符串(我希望標籤採用的文本)和字符串lbName,以便該方法可以識別要更新的標籤控件。你推薦我在這裏做什麼?我應該堅持Form.Invoke嗎?謝謝! – Anders 2014-09-24 16:58:42
99%的時間使用Invoke是錯誤的。非常容易出現死鎖和比賽,總是使用BeginInvoke。單個對象足以存儲*任何內容*,如有必要,可使用小型輔助類。拉姆達幾乎總是方便的選擇。 – 2014-09-24 17:05:59