问题标签 [autoresetevent]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - AutoResetEvent 没有正确阻塞
我有一个线程,它创建可变数量的工作线程并在它们之间分配任务。这可以通过向线程传递一个TaskQueue对象来解决,您将在下面看到其实现。
这些工作线程简单地遍历给定的TaskQueue对象,执行每个任务。
如您所见,我使用AutoResetEvent对象来确保工作线程不会过早退出,即在获得任何任务之前。
简而言之:
- 主线程通过Enqeueue将任务分配给线程 - 将任务添加到其 TaskQueue
- 主线程通过调用TaskQueue的Finish ()方法通知线程没有任务要执行
- 工作线程通过调用TaskQueue的Dequeue ()方法检索下一个分配给它的任务
问题是Dequeue () 方法经常抛出一个 InvalidOperationException,说 Queue 是空的。如您所见,我添加了一些日志记录,结果证明AutoResetEvent不会阻止Dequeue(),即使没有调用其Set()方法。
据我了解,调用 AutoResetEvent.Set() 将允许等待线程继续(之前调用 AutoResetEvent.WaitOne()),然后自动调用 AutoResetEvent.Reset(),阻止下一个服务员。
那么有什么问题呢?我是不是搞错了什么?我在某处有错误吗?我现在在上面坐了 3 个小时,但我不知道出了什么问题。请帮我!
非常感谢!
.net - AutoResetEvent 类型是否适合原子开关?
假设我正在处理来自多个线程的大量传入数据。当满足某些条件时,我可能希望这些数据充当特定操作的触发器。但是,该操作是不可重入的;因此,快速连续触发两次相同的触发器只会导致动作运行一次。
使用简单的bool
标志来指示操作当前是否正在运行并不是一个可靠的解决方案,因为可能会发生竞争条件,并且两个(或更多)线程最终仍然可能最终同时运行相同的操作。当然,在同步对象上的语句内bool
是可行的;lock
但我通常更愿意尽可能避免锁定*。
目前我在这些情况下所做的AutoResetEvent
基本上是使用原子开关的一种形式。代码通常如下所示:
这行得通,但令我震惊的是,这可能是该类的不太理想的用例AutoResetEvent
。您会说这是解决此问题的适当方法,还是使用其他机制更有意义?
更新:正如乔恩指出的那样,使用Monitor.TryEnter
作为锁定策略(而不是简单的lock
,我认为它大致相当于Monitor.Enter
),真的非常简单:
也就是说,我强烈倾向于支持Henk使用Interlocked
. 这似乎很简单。
c# - 如何避免安全手柄已关闭
我在测试中有以下代码:
现在,如果我运行以下测试
第二次调用 LoadIncomeStatementViewModel() 我在 EventHandler handler = (sender, e) => evt.Set();
当第二次重新运行该方法时,使用语句肯定已经重新初始化了 evt。我有一种感觉,这可能与 Resharper Test Runner (Nunit 2.7) 有关。
c# - 是否存在基本上首先调用 Reset 的 WaitOne 方法?
我正在使用 AutoResetEvent,其中可以对事件进行多个 Set 调用(异常处理)。有时会调用额外的 Set,因此当代码对 WaitOne 事件进行第二次调用时,它会直接通过,因为门已经打开。
解决方案是在 WaitOne 之前调用 Reset。有没有更清洁的解决方案,或者这是唯一的方法?示例代码:
处理完异常后,我需要再次调用 DoSomeWork,但由于 Set 可能已在多个异常中调用(或重新抛出异常),WaitOne 只是流过。
我的解决方案是始终在 WaitOne 之前调用 Reset。这是合适的解决方案、糟糕的设计,还是有不同类型的事件可以处理这种情况?
编辑:我刚刚将评论的重置(建议的解决方案)移到了事件旁边。
c# - AutoResetEvent 仅在未设置该次数时等待的最佳方式
我可能超出了 AutoResetEvent 的正确设计,但不知道该转向什么。我想要这种行为:
不幸的是(对于我的问题),这不是 AutoResetEvent 的行为方式。对于这种情况,最好的类是什么?
注意:我可以访问 .NET 并行扩展库。
c++ - Win32 重置事件,如使用 boost C++ 的同步类
我需要一些让人想起 Win32 重置事件的机制,我可以通过与 WaitForSingleObject() 和 WaitForMultipleObjects() 具有相同语义的函数来检查它们(目前只需要 ..SingleObject() 版本)。但我的目标是多个平台,所以我只有 boost::threads (AFAIK) 。我想出了以下课程,并想询问潜在的问题以及是否可以完成任务。提前致谢。
示例用法;
编辑
我已根据 Michael Burr 的建议修复了代码。我的“非常简单”的测试表明没有问题。
.net - IObservable - 替换 AutoResetEvent
只是想知道如何替换下面的 AutoResetEvent ?我试图思考如何以 RX 方式或任务来完成它,但我可以看到如何去做。
multithreading - 如何查找当前执行的代码是否在 UI 线程上?
我正在开发一个 silverlight 应用程序,如果它在 UI 线程上运行,我有一个方法应该抛出异常,因为它使用 AutoResetEvent.WaitOne() 而没有超时,这会导致 UI 线程冻结。
如何检测当前线程是否为 UI 线程?
编辑:
请注意,此方法驻留在类库中,而不是 UI 组件中。
c# - AutoResetEvent 重置方法
有人可以介绍 AutoResetEvent.Reset() 方法的用例吗?我什么时候以及为什么要使用这种方法?我了解 WaitOne 和 Set 但这对我来说还不清楚。
c# - 使用 AutoResetEvent 向工作线程发出信号
我有一个不断运行处理数据的服务,它通过消息传递接收处理新数据的请求。当它忙于处理新的请求时,它们会被合并在一起,这样它们就会被同时处理。AutoResetEvent 用于通知处理器有新请求可用。
我的问题是在 EventLoop 中,WaitOne 之后的 currentRequest 是否有可能为空?
将 _eventAvailable.Set() 放在 lock(_eventLocker) 之外是不好的做法吗?我把它移了出来,这样它就不会开始在 WaitOne 上运行,并立即对锁(_eventLocker)进行竞争。
关于如何更好地编写以下代码的任何建议?