我正在使用 AutoResetEvent,其中可以对事件进行多个 Set 调用(异常处理)。有时会调用额外的 Set,因此当代码对 WaitOne 事件进行第二次调用时,它会直接通过,因为门已经打开。
解决方案是在 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。这是合适的解决方案、糟糕的设计,还是有不同类型的事件可以处理这种情况?
编辑:我刚刚将评论的重置(建议的解决方案)移到了事件旁边。