2

次のコードを検討してください。

using (var mre = new ManualResetEvent(false))
{
     var bgWkr = new BackgroundWorker();
     bgWkr.DoWork += delegate(object sender, DoWorkEventArgs e)
     {
         var mrEvent = e.Argument as ManualResetEvent;
         // some processing...

         mrEvent.WaitOne();
         // broadcast an event
     };
     bgWkr.RunWorkerAsync(mre);

     // some other processing...

     // hook into the same event
     mre.Set();
}

生成されたワーカーが完了するまでに少し時間がかかるとしましょう。ワーカー スレッドが終了し、ManualResetEvent を待機するまでに、using ブロックをしばらく離れています。using ブロックを離れるときに mre が閉じられており (破棄されていた場合)、少なくとも例外がスローされると想定します。これは安全な仮定ですか?

この例は、ManualResetEvent を使用した最適な例ではないかもしれませんが、using ブロック内の匿名メソッド内で IDisposable オブジェクトにアクセスし、using ブロックを終了した後に匿名メソッドが呼び出されるケースを説明するためのものです。使い捨てオブジェクトを保持するメカニズムはありますか? 私はそうは思いませんが、その理由(ある種のブードゥー教が働いている場合)またはそうでない理由について確認したいと思います。

乾杯、

4

2 に答える 2