使用KeyWord+Lambda表达式

本文关键字:表达式 KeyWord+Lambda 使用 | 更新日期: 2023-09-27 18:19:48

我在我们的一个旧项目中发现了一些奇怪的代码,它看起来像这样:

using (var removeGroupMembershipWorker = new BackgroundWorker())
{
    removeGroupMembershipWorker.DoWork += (senderRGMW, eRGMW) =>
    {
    };
    removeGroupMembershipWorker.RunWorkerAsync();
}

Lambda中的Code被删除。

对我来说,using关键字和lambda表达式不能很好地结合在一起:lambda必须在类级别上利用对象,否则以后就无法调用代码。

但是using关键字在这里是如何工作的呢?线程显然不会等待Async完成,但是当using块被留下时会发生什么?

在这种情况下,using只是被忽略了吗?

伊迪丝说:由于我想念拉胡斯的答案和这个绝妙的链接;我把它添加到这里:http://softwareblog.alcedo.com/post/2011/12/09/Using-blocks-and-asynchronous-operations.aspx
这解释了关于主题的问题和解决方案。

使用KeyWord+Lambda表达式

using块是try的语法糖。。。finally构造,其中finally块调用对象的IDisposable.Dispose()方法。当然,这就是为什么要处理的对象必须实现IDisposable,否则会出现编译时错误。

调用Dispose()与允许对象超出范围进行垃圾收集不同。特别是,如果lambda中的代码碰巧通过闭包引用removeGroupMembershipWorker,则lambda可能最终引用已被释放的对象。这种情况可能会导致错误,也可能不会导致错误,这取决于Dispose()的实际操作。

因此,正如您所提到的,using模式可能不是最好的想法。如果你确实需要调用Dispose()——对于任何IDisposable,你都应该这样做——你可以在安全的时候直接调用它。"安全这样做"的含义取决于你的代码,但本质上,Dispose()需要是对对象调用的最后一个方法(当然,Dispose()中调用的任何方法除外)。