Tho*_*rin 6 .net c# resharper closures
我正在努力摆脱静态代码分析中的一些警告.在一个特定情况下,没有在a上进行处理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;
}
Run Code Online (Sandbox Code Playgroud)
现在,我意识到这可能会导致问题.我也碰巧使用Resharper并且它通过"访问处理关闭"的消息警告我.
Resharper建议通过将违规行更改为:
if (completedEvent != null)
{
completedEvent.Set();
}
Run Code Online (Sandbox Code Playgroud)
现在,提出的解决方案让我困惑.在正常情况下,没有理由null通过using语句设置变量..NET中的闭包是否有一些实现细节可以保证变量null在被关闭的变量被释放之后?
作为一个奖金问题,处理问题的解决方案是ManualResetEvent什么?
你正在混淆ReSharper的"快速修复"和"上下文动作".当ReSharper建议修理某些东西时,很可能你会在那里看到一个灯泡.你没有在这里看到一个灯泡,因为这个警告没有快速修复.
但除了快速修复之外,ReSharper还具有"上下文操作",它可以为您执行一些例行任务(将它们视为小型重构).当ReSharper对光标下的代码有上下文操作时,它会显示一个选择.在这里,您将看到一个名为"检查某些内容是否为空"的上下文操作.它与警告没有关系,并且没有约定在处理变量之后将其设置为null.
此外,当您按Alt-Enter时,您会看到一个标记出来的灯泡,让您觉得ReSharper不建议对此警告进行任何快速修复,但它可以通过注释禁用它.事实上,这是使这个警告轻易消失的唯一方法.但我改写了这段代码.