次のコードを検討してください。
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 ブロックを終了した後に匿名メソッドが呼び出されるケースを説明するためのものです。使い捨てオブジェクトを保持するメカニズムはありますか? 私はそうは思いませんが、その理由(ある種のブードゥー教が働いている場合)またはそうでない理由について確認したいと思います。
乾杯、