Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用关键字+;表达式_C#_Lambda_Using - Fatal编程技术网

C# 使用关键字+;表达式

C# 使用关键字+;表达式,c#,lambda,using,C#,Lambda,Using,我在我们的一个老项目中发现了一些奇怪的代码,如下所示: using (var removeGroupMembershipWorker = new BackgroundWorker()) { removeGroupMembershipWorker.DoWork += (senderRGMW, eRGMW) => { }; removeGroupMembershipWorker.RunWorkerAsync(); } Lambda中的代码被省略 对我来说,使

我在我们的一个老项目中发现了一些奇怪的代码,如下所示:

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

    };
    removeGroupMembershipWorker.RunWorkerAsync();
}
Lambda中的代码被省略

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

但是
在这里如何使用
关键字呢?线程显然不会等待异步完成,但是当
using
块离开时会发生什么呢

在这种情况下,
使用的
是否被忽略

伊迪丝说:因为我错过了拉胡斯的答案和这个极好的链接;我在这里加上:

这就解释了这个主题的问题和解决方案。

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

调用
Dispose()
与允许对象超出范围进行垃圾收集不同。特别是,如果lambda中的代码恰好通过闭包引用了
removeGroupMembershipWorker
,那么lambda可能最终引用了已释放的对象。此场景可能会导致错误,也可能不会导致错误,这取决于
Dispose()
实际执行的操作


因此,正如您所提到的,
使用
模式在这里可能不是最好的主意。如果您确实需要调用
Dispose()
——对于任何
IDisposable
,您确实应该调用它——您可以在安全的情况下直接调用它。“安全地这样做”的含义取决于您的代码,但本质上,
Dispose()
需要是对象上调用的最后一个方法(当然,除了
Dispose()
中调用的任何方法)。

您能发布RunWorkerAsync()方法的主体吗?无需感谢,正如Raghu所写,这两个概念不能很好地结合在一起使用
和lambdas之间的交互没有问题,这里的问题是,由于对象是异步的,因此对象的寿命应该更长。所以lambda不是这里的问题,async nature+dispose是。我想说的是,说哪一个是最后一个调用通常是不可能的,因为我们不知道异步方法的工作顺序。如前所述,我认为真正有IDisposable和异步方法的对象很少,Backgroundworker是迄今为止我唯一知道的对象。奇怪的是,我漏掉了Raghu的一条评论,它有一个关于这个主题的很好的链接。@MatthiasMüller,在所有异步操作完成之前,您不会想调用
Dispose()
,这就是为什么
使用
在这里可能不起作用的原因。有多种方法可以确定何时实际处理对象,但如果没有更多信息,我不知道该建议什么。流也有异步方法。