[英]using KeyWord + Lambda Expressions
我在我們的一個舊項目中發現了一些奇怪的代碼,它看起來像這樣:
using (var removeGroupMembershipWorker = new BackgroundWorker())
{
removeGroupMembershipWorker.DoWork += (senderRGMW, eRGMW) =>
{
};
removeGroupMembershipWorker.RunWorkerAsync();
}
Lambda中的守則被省略了。
對我來說, using
關鍵字和lambda表達式並不能很好地結合在一起:Lambda必須在類級別上利用該對象,否則以后無法調用該代碼。
但是如何using
關鍵字在這里工作? 線程顯然不等待Async完成,但是當using
塊時,會發生什么?
在這種情況下, using
是否被忽略了?
伊迪絲說:因為我錯過了拉格斯的回答和這個極好的聯系; 我在這里添加: http : //softwareblog.alcedo.com/post/2011/12/09/Using-blocks-and-asynchronous-operations.aspx
這解釋了有關主題的問題和解決方案。
using
塊是用於try
... finally
結構的語法糖,其中finally
塊調用對象的IDisposable.Dispose()
方法。 當然,這是為什么被處置的對象必須實現IDisposable
,否則你會得到一個編譯時錯誤。
調用Dispose()
與允許對象超出范圍以進行垃圾收集不同。 特別是,如果lambda中的代碼碰巧通過閉包引用removeGroupMembershipWorker
,則lambda最終可能會引用已被處置的對象。 這種情況可能會也可能不會導致錯誤,具體取決於Dispose()
實際執行的操作。
所以,正如你所提到的, using
模式可能不是最好的主意。 如果你確實需要調用Dispose()
- 你真的應該為任何IDisposable
- 你可以在安全的情況下直接調用它。 “安全這樣做”意味着取決於你的代碼,但實質上, Dispose()
需要是在對象上調用的最后一個方法Dispose()
當然,在Dispose()
調用的任何方法除外)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.