Dot-Net
Delegate.EndInvoke() 真的有必要嗎?
我已經閱讀了幾個論壇,甚至一兩個 stackoverflow 問題都說在使用 Delegate.BeginInvoke 時必須使用 Delegate.EndInvoke。我讀過的很多關於使用 BeginInvoke 的文章都沒有提到使用 EndInvoke。此外,我僅使用 BeginInvoke 部署了生產程式碼,似乎沒有任何記憶體問題。我使用 BeginInvoke 的方式通常是使用我不關心它們何時完成或它們需要多長時間來處理的執行緒。
來自 MSDN 文章“非同步呼叫同步方法”:
無論您使用哪種技術,始終呼叫 EndInvoke 來完成您的非同步呼叫。
現在,有理論,然後有實踐。您已經發現,就像您之前的許多其他開發人員一樣,您通常可以忽略這個記錄在案的要求而僥倖成功。它可能是一個實現細節,是否
EndInvoke真的做了任何絕對必要的事情來防止你的應用程序崩潰、記憶體洩漏等。但事情是這樣的:如果這是一個記錄的要求,你真的應該這樣做。這不僅僅是理論。這是關於在發生變化時保護自己。通過記錄這個要求,這個非同步呼叫機制的設計者基本上給了自己改變方式
BeginInvoke和EndInvoke工作的自由,這樣,如果有足夠的理由(例如,性能增強),EndInvoke可能突然變得更加必要。假設如果你忘記它會突然導致死鎖。他們已經用“總是打電話EndInvoke”來掩飾自己;如果您的應用程序因您未遵循此要求而停止執行,那麼您有責任。我並不是說這必然是一種可能的情況。我的觀點很簡單,你不應該——或者至少我不會——問“這真的有必要嗎?” 懷著這樣的心態,如果我能擺脫它,那麼我會的,因為有記錄表明你應該這樣做。