いくつかのアクションを同期的に実行する方法が必要です。これは0.5秒で完了するはずですが、数分間ぶらぶらする可能性があります。タイムアウトした場合、結果は気にしません。これが、コンパイラによって生成されたデリゲートを使用して現在実行していることです。BeginInvoke:
static void Main()
{
bool disposed = false;
var wait = new ManualResetEvent(false);
var a = new Action(
() =>
{
Thread.Sleep(1000); // <- some looong action
if (!disposed)
lock (wait)
if (!disposed)
wait.Set();
});
a.BeginInvoke(a.EndInvoke, null);
bool success = wait.WaitOne(500);
Console.WriteLine(success ? "success" : "timeout");
lock (wait)
{
wait.Dispose();
disposed = true;
}
Console.ReadLine();
}
醜いですね。そして、ラムダクロージャの変数が変更されていることを知ってdisposed
います(私のReSharperとは異なり、このC#機能が好きです)。すべて私が処分したいからManualResetEvent
です。.NET4でより良いアプローチを提案できますか?おそらく、イベントの破棄をスキップして、GCに依存する必要がありますか?
注:ManualResetEvent.Set()
破棄されたインスタンスで実行しようとすると爆発します。