2009-09-01 82 views

回答

14

這基本上描述了一種在線程之間推動工作;要將工作項目推送到其他線程,請使用Invoke(同步)或BeginInvoke(異步 - 稍後稍後請撥打EndInvoke)。同樣,InvokeRequired用於詢問「我是否需要這樣做?或者我可以自己執行這項工作嗎?」。

此接口最常見的用法是在windows窗體中,它是如何將工作推送到UI線程的一部分;您當然可以同樣使用Control.Invoke/Control.BeginInvoke,但表單控件實現此接口以允許抽象 - 因此下游代碼無需將其自身綁定到Windows窗體。在表單的情況下,InvokeRequired意味着「我是否是UI線程?」。

實際上,我不確定這是直接使用它的共同點。在UI上處理事件更爲常見,並且使用最合適的本地機制讓UI處理線程切換。

典型用法:

obj.Invoke((MethodInvoker) SomeMethod); 

,其執行(通過一個代表)SomeMethodobj管理的線程上(它實現接口)。

+0

感謝marc它的一個很好的答案.. – 2009-09-15 05:36:25

+0

我最近查看了一個非常簡單的'ISynchronizeInvoke'實現伴隨着一個非常簡單的'IAsyncResult'實現:http://gurkashi.blogspot.com/2011/01/hi-all-在此結果後我意志 - demonstrate.html。不喜歡這個問題,但我想知道,現在,與.Net 4.5我可以使用異步/等待,而不是回調的BeginInvoke老派模式。儘管接口說'BeginInvoke',*引擎蓋下*我可以從我的4.5工具箱實現。 – IAbstract 2012-06-13 01:38:57

2

ISynchronizeInvoke Interface

的ISynchronizeInvoke接口 提供有關 一個事件的發生的對象之間的同步和異步通信 。實現此接口的對象 可以通過 接收事件發生時有 的通知,並且他們可以響應有關該事件的查詢 。這樣, 客戶端可以確保一個請求 已被處理之前,他們提交 後續請求,取決於 完成第一個。

另請參閱

http://blogs.msdn.com/jaredpar/archive/2008/01/07/isynchronizeinvoke-now.aspx

+0

Yap ..我認爲這可以用來更新主線程中的UI使用低層邏輯的後臺線程? – 2009-09-01 06:05:17