2009-08-13 52 views
25

This page in the MS documentation,覆蓋異步在Windows窗體應用程序,規定:每個BeginInvoke都必須跟一個EndInvoke嗎?

您可以調用EndInvoke如果neccesary從委託檢索的返回值,但這不是必需的。(強調)

This page covering the general case of asynchronous delegates,規定不同的東西:

不管你使用哪種技術,總是調用EndInvoke來完成你的異步調用。

這兩個似乎是直接衝突。

這是真的嗎?有人可以解釋嗎?

另請參閱a post by Phil Haack

相關:Is EndInvoke optional, sort-of optional, definitely not optional?

回答

22

除非接口的文檔明確說明,否則您必須爲每個調用BeginInvoke的地方調用EndInvoke。主要原因是EndInvoke是所有者可以安全釋放可能爲BeginInvoke調用分配的某些資源(例如WaitHandle)的唯一時間。

但是這個規則也有例外。 API(如Control.BeginInvoke)不需要EndInvoke,但它在文檔中是明確的。

13

兩者都是真實的 - 他們是不同的呼叫。

一般來說您應該始終調用EndInvoke以確保釋放由異步調用獲取的任何資源。

但是,Windows窗體小組已確保您不需要爲Control.Invoke執行此操作。雖然你可能需要爲ISynchronizeInvoke的其他實現做。

+0

我同意你的大部分答案,除了評論他們是「不同的電話」。他們似乎並不是完全不同的電話。他們是不是都在討論異端代表的EndInvoke?只是控制代理上的EndInvoke是一個特例。 – Cheeso 2009-08-13 22:37:06

+3

@Cheeso:否 - Control.BeginInvoke根本不是*委託上的調用*。它*需要*代表。 – 2009-08-13 22:41:40

1

在結果「有用(如果可用,但不是必需的)」之前,我已經對代表使用了「忘卻」(fire-and-forget)方法。請記住,您沒有完成該方法的保證。尤其是,這裏有一個地方,我用它:

  • 開始委託來檢查應用程序更新如果發生錯誤/超時
  • 代表一開始就超時
  • web請求,或者如果應用程序爲跟上時代的,該方法只返回
  • 如果應用程序是過時的,我把非焦點竊取系統托盤消息,說明這樣(系統托盤圖標,除非更新可用)

無論哪種方式,第四e應用程序不會中斷。

相關問題