Dot-Net

每個 BeginInvoke 之後必須跟一個 EndInvoke 嗎?

  • August 13, 2009

MS 文件中的此頁面,涵蓋 Windows 窗體應用程序中的非同步,指出:

如果需要,您可以呼叫 EndInvoke 從委託中檢索返回值,但這不是必需的。(重點補充)

該頁面涵蓋了非同步委託的一般情況,陳述了一些不同的內容:

無論您使用哪種技術,始終呼叫 EndInvoke 來完成您的非同步呼叫。

這兩者似乎是直接衝突的。

哪個是真的?有人可以解釋嗎?

另請參閱Phil Haack 的文章

相關:EndInvoke 是可選的,是可選的,絕對不是可選的嗎?

除非介面的文件明確說明,否則您必須為每個呼叫 BeginInvoke 的地方呼叫 EndInvoke。主要原因是 EndInvoke 是所有者可以安全地釋放某些可能分配給 BeginInvoke 呼叫(例如 WaitHandle)的資源的唯一時間。

但這條規則也有例外。Control.BeginInvoke 等 API 不需要 EndInvoke,但它在文件中是明確的。

引用自:https://stackoverflow.com/questions/1274276