gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:38:18 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com