簡體   English   中英

使用KeyWord + Lambda表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM