2011-05-01 106 views
1

我讀過AsyncCallback函數將在委託調用完成後完成所有後處理任務。我的問題是在EndInvoke之後/低於EndInvoke後編寫後處理任務的區別是什麼,因爲EndInvoke將等待直到委託調用返回。爲什麼選擇AsyncCallback?

回答

4

使用委託的BeginInvoke()方法的要點是目標將異步運行。如果您在BeginInvoke()之後立即調用EndInvoke(),那麼使用它就不再有任何意義。通過直接調用委託,您將獲得完全相同的行爲,減去開銷和線程頭痛。

當目標方法完成時,該值正在獲取回調,異步執行後立即進行回調。只有然後調用EndInvoke(),它立即完成。清理系統資源並在目標方法拋出一個時重新拋出異常。不要按照upvoted的回答中的建議,跳過調用EndInvoke(),至少會泄漏10分鐘的資源。

2

您可以選擇不調用EndInvoke,只依賴回調。通過這種方式,啓動來自代理本身,而不是來自您,並且您不必決定調用何時完成。

+0

謝謝Bas。但是EndInvoke只有在委託成功完成後才能執行,不是什麼問題? – logeeks 2011-05-01 19:36:21

+0

您可以檢查操作是否在提供的IAsyncResult參數上使用IsCompleted完成。 – Bas 2011-05-01 19:41:24

+2

不*忽略調用EndInvoke()。 – 2011-05-01 20:21:15