静的コード分析からのいくつかの警告を取り除くことに取り組んでいます。ある特定のケースでは、 で破棄が行われませんでした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
によって変数が設定される理由はありません。クローズされた変数が破棄された後に変数が存在することを保証する、.NET のクロージャーの実装の詳細はありますか?using
null
おまけの質問として、廃棄の問題に対する適切な解決策は何でしょうManualResetEvent
か?