c# - 是否有一个 WaitOne 方法本质上首先调用 Reset?

标签 c# events waithandle autoresetevent

我正在使用 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/

相关文章:

python - 当滚动条已设置时更新 WheelEvent 上的 QLineEdit

Angular 6 : Send click event in child to parent

c# - 为什么我的 NamedPipeServerStream 不等待?

c# - 在asp.net中单击按钮时显示div

c# - 如何使 ToolStrip 按钮立即可点击而无需先点击表单?

c# - Android 7.0 上不会调用 OnCreateOptionsMenu

c# - 获取列表中的最大 KeyValuePair<KeyValuePair>

c# - 在事件分派(dispatch)之前检查 null ...线程安全吗?

c# - 如何等待第 2 个 : a process and an EventWaitHandle

.net - 互斥体是否正确实现以及如何处理它?