イベントで複数の Set 呼び出しを行うことができる AutoResetEvent を使用しています (例外処理)。追加の Set が呼び出される場合があるため、コードが WaitOne イベントで 2 番目の呼び出しを行うと、ゲートが既に開かれているため、そのまま通過します。
解決策は、WaitOne の直前に Reset を呼び出すことです。よりクリーンなソリューションはありますか、それともこれが唯一の方法ですか? コード例:
private void DoSomeWork()
{
Thread thrd = new Thread(new ThreadStart(DoSomeOtherStuff));
thrd.Start();
//mEvt.Reset();
mEvt.WaitOne();
//continue with other stuff
}
private void DoSomeOtherStuff()
{
/* lots of stuff */
mEvt.Set();
}
private void ExceptionTriggerNeedsToBreakOutOfDoSomeWork()
{
mEvt.Set();
}
例外が処理された後、DoSomeWork を再度呼び出す必要がありますが、Set は複数の例外 (または再スローされた例外) で呼び出された可能性があるため、WaitOne はそのまま流れます。
私の解決策は、常に WaitOne の前に Reset を呼び出すことです。これは適切な解決策ですか、設計が不十分ですか、それともこのシナリオを処理する別の種類のイベントがありますか?
編集:コメント付きのリセット(提案された解決策)をイベントの横に移動しました。