我正在努力摆脱静态代码分析中的一些警告。在一个特定情况下,没有对ManualResetEvent
.
有问题的代码在Func
主线程上执行 a 并将调用线程阻塞一定的毫秒数。我意识到这听起来很奇怪,但这超出了这个问题的范围,所以请耐心等待。
假设我添加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();
}
现在,提出的解决方案让我感到困惑。在正常情况下,没有理由将变量设置为null
语句using
。.NET 中的闭包是否有一些实现细节可以保证变量在null
已关闭的变量被释放之后?
作为一个额外的问题,什么是处理问题的好方法ManualResetEvent
?