これはIs it safe to signal and immediately close a ManualResetEvent?と密接に関連しており、その問題に対する1つの解決方法を提供する可能性があります。ManualResetEvent.WaitOne()でObjectDisposedExceptionを捕捉しても安全ですか?
私は同じ仕事をしたいと思っているスレッドがたくさんありますが、そのうちの1つだけが許可されなければならず、他の人は作業者が完了してその結果を使用するまで待つべきです。
基本的には一度だけ作業をしたいと思っています。
更新:が、私はこれは、.NET 4のレイジー< T>を使用して対処することができ、初期化の問題がないことを追加してみましょう。一度はをタスクごとに1回とし、これらのタスクは実行時に決定されます。これは以下の簡単な例から明らかではないかもしれません。
上記の質問に対するHans Passantの回答から簡単な例を少し変更すると、以下のことが安全になると思います。
がWAITONEの呼び出しです:
static void Main(string[] args)
{
ManualResetEvent flag = new ManualResetEvent(false);
object workResult = null;
for (int ix = 0; ix < 10; ++ix)
{
ThreadPool.QueueUserWorkItem(s =>
{
try
{
flag.WaitOne();
Console.WriteLine("Work Item Executed: {0}", workResult);
}
catch (ObjectDisposedException)
{
Console.WriteLine("Finished before WaitOne: {0}", workResult);
}
});
}
Thread.Sleep(1000);
workResult = "asdf";
flag.Set();
flag.Close();
Console.WriteLine("Finished");
}
が、私は私の質問のコアがあると思います(それだけでは説明したユースケースとは少し違うのですが、スレッドの用語とその関係で、それは同じです) WaitOneへの呼び出しが成功したことに相当するObjectDisposedExceptionのために、メモリ障壁に関して中止されましたか?
他のスレッドが変数workResultに安全にアクセスできるようにする必要があります。
私の推測:安全である必要があります。それ以外の場合、WaitOneはManualResetEventオブジェクトが最初に閉じられていることを安全にどのように判断できますか?
、私は最初の場所で '閉じる()'を呼び出す気になぜ年後、私は疑問に思う:私はC#ので
ジョーAlbahariのスレッディングは、次のセクションでは、適用されるこの特定のケースでは、非常に有用であることが証明しました[GCだけでクロージャを処理させるかもしれません](http://stackoverflow.com/a/2358158/709537)未来の未定義のポイントです。 –