【发布时间】:2013-01-08 15:53:59
【问题描述】:
我正在努力消除静态代码分析中的一些警告。
在一个特定情况下,没有对 ManualResetEvent 进行处理。
有问题的代码在主线程上执行Func 并阻塞调用线程一定的毫秒数。我意识到这听起来很奇怪,但它超出了这个问题的范围,所以请耐心等待。
假设我像这样添加using 语句:
object result = null;
using (var completedEvent = new ManualResetEvent(false))
{
_dispatcher.BeginInvoke((Action)(() =>
{
result = someFunc;
completedEvent.Set(); // Here be dragons!
}));
completedEvent.WaitOne(timeoutMilliseconds);
return result;
}
现在,我意识到这可能会导致问题。我也碰巧使用了 Resharper,它警告我“访问已处置的闭包”消息。
Resharper 建议通过将违规行更改为:
if (completedEvent != null)
{
completedEvent.Set();
}
现在,建议的解决方案让我感到困惑。在正常情况下,没有理由通过using 语句将变量设置为null。 .NET 中的闭包是否有一些实现细节可以保证在已关闭的变量被释放后变量为null?
作为一个额外的问题,处理ManualResetEvent 的问题有什么好的解决方案?
【问题讨论】:
-
@Steven 为什么代理必须使用
completedEvent的副本?你能解释一下这一点吗?
标签: c# .net closures resharper