我正在努力擺脫靜態代碼分析的一些警告。 在一個特定情況下,ManualResetEvent
沒有處理。此resharper修復處置關閉警告是否有意義?
有問題的代碼在主線程上執行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();
}
現在,提出的解決方案令我費解。在正常情況下,沒有理由將變量設置爲null
by using
聲明。 是否有一些在.NET中關閉的實現細節,可以保證變量在被關閉的變量處理後變爲null
?
作爲一個獎金問題,如何處置ManualResetEvent
的問題會是一個很好的解決方案?
@Steven爲什麼委託必須使用'completedEvent'的副本?你能解釋這一點嗎? –