我正在使用 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。这是合适的解决方案、糟糕的设计还是有不同类型的事件可以处理这种情况?
编辑:我刚刚将评论的重置(建议的解决方案)移到了事件旁边。
最佳答案
这不是一个真正的问题,WaitOne() 调用会自动重置事件。毕竟,您使用的是 AutoResetEvent,而不是 ManualResetEvent。这里的关键词是自动重置。
通过 WaitOne() 调用看到它正在运行也很正常。您有一个很好的多核 CPU,当您调用 Start() 时,线程立即启动,只花了几微秒就完成了工作。毫秒,无论如何,比眨眼还快。
也许更重要的是,您只是不需要这里的线程。开始一个,然后等待它完成是没有意义的。只需直接调用 DoSomeOtherStuff() 即可。
关于c# - 是否有一个 WaitOne 方法本质上首先调用 Reset?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4109395/