使用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
这解释了关于主题的问题和解决方案。
using
块是try
的语法糖。。。finally
构造,其中finally
块调用对象的IDisposable.Dispose()
方法。当然,这就是为什么要处理的对象必须实现IDisposable
,否则会出现编译时错误。
调用Dispose()
与允许对象超出范围进行垃圾收集不同。特别是,如果lambda中的代码碰巧通过闭包引用removeGroupMembershipWorker
,则lambda可能最终引用已被释放的对象。这种情况可能会导致错误,也可能不会导致错误,这取决于Dispose()
的实际操作。
因此,正如您所提到的,using
模式可能不是最好的想法。如果你确实需要调用Dispose()
——对于任何IDisposable
,你都应该这样做——你可以在安全的时候直接调用它。"安全这样做"的含义取决于你的代码,但本质上,Dispose()
需要是对对象调用的最后一个方法(当然,Dispose()
中调用的任何方法除外)。