问题标签 [manualresetevent]

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.

0 投票
1 回答
2620 浏览

c# - 何时应处置 ManualResetEvent?

我正在使用一个使用 ManualResetEvent 同步线程的应用程序。FxCop 告诉我处置这些物品。我发现以下讨论告诉我同样的事情:

我需要 Dispose() 或 Close() 一个 EventWaitHandle 吗?

但我不知道何时处置 ManualResetEvent 的实例。

以下简化代码演示了该问题:

问题是存在多个 ManualResetEvent 实例,并且多个线程正在等待每个实例。

如果我记住列表中的实例,我不知道何时处理它。在 WaitOne() 调用之后处理它会多次处理它,并且可能会在其他线程仍在等待时处理它。

创建事件的线程没有对它的任何引用。setter-thread 不应该释放它,因为还有其他线程在等待这个 MRE。每个等待的线程都不能像前面提到的那样处理它。

所以问题是:这个 ManualResetEvent 应该在什么时候被释放?

0 投票
1 回答
740 浏览

c - 从命名管道并发选择

假设我有一个从多个进程或线程多次打开的 fifo(命名管道)。他们都将调用 select() 进行并发读取。如果一个作家进来并写入,比如说一个字节到这个fifo,所有阻塞的select()调用会同时返回还是只选择一个线程并从select()返回?

对此是否有任何规范,或者这是否取决于系统?

我问的原因是我想使用 fifos 实现类似 Windows 的手动重置事件。手动重置事件要求当事件发出信号时,所有等待的线程都将被释放(而不是自动重置事件只有一个)。

我可以为此使用 pthread conds,但我的要求是多个进程共享事件。

谢谢。

0 投票
2 回答
805 浏览

c# - ManualResetEvent 等待设置后未释放

我正在从网上下载两个 JSON 文件,之后我想允许加载两个页面,但不是之前。但是,ManualResetEvent为了加载页面而需要设置的 永远不会“触发”。即使我知道它被设置了,WaitOne也永远不会返回。

启动下载的方法:

下载方法,设置ManualResetEvent

等待方法(本例中的构造函数)

如果我在尝试访问该构造函数之前等待,它很容易通过 if 语句并且不会被捕获WaitOne,但是如果我立即调用它,我会卡住,并且永远不会返回......

有任何想法吗?

0 投票
1 回答
393 浏览

c# - ManualResetEvent.WaitOne() causes AccessViolation

An ASP.NET invoice application has a save button, that triggers (among other things) the generation of a pdf file on disk using the form data, the userID etc.

An excerpt from the GeneratePDF method:

For some reason, the WaitOne() method throws an AccessViolation most of the time but not always, but I don't seem to able to debug further than that. Beyond that is mscorlib.

Three things are important to understand in this story:

  • This is not my code
  • I have little knowledge about threading. It's just something I rarely come into contact with in my job.
  • This worked fine up until a few weeks ago on my development machine. Chances are, that some external factor is causing this, but I cannot find what or why. There are no code updates between then and now.

It's quite possible, that this question needs additional info. As my understanding of threading is severely limited, I will update my question at your request.

0 投票
1 回答
634 浏览

c# - 使用等待句柄

我正在尝试做这样的事情:

在代码的其他地方,会有调用的方法:

所以 LongRunningOperation() 被执行..

问题是,handler.Set()可以在AsyncWait()线程运行时再次调用LongRunningOperation()

这使得当仍在执行LongRunningOperation()时被调用时将永远不会被调用handler.Set()AsyncWait()LongRunningOperation()

如何做到这一点?:(

0 投票
1 回答
1135 浏览

c# - 带有 BackgroundWorker 的 ManualResetEvent:WaitOne() 时当前线程正忙吗?

想象以下情况:

  1. 我从第三方服务器的 ui 线程上收到了一个信号。

  2. 我用 RunAsync 启动一个 BackgroundWorker 从数据库和另一个异步线程中获取数据,该线程将轮询另一个硬件并接收信号,也不在 ui 线程中

  3. 在 bg 的 DoWork 事件处理程序中,我调用 manualresetEvent.Reset()。然后我调用数据获取方法,然后调用manualresetEvent.Set(),最后通过调用它来调用ui线程上的方法METH_UI_1。

  4. 另一个硬件线程将接收硬件数据,然后它本身通过 Invoke 传递到 ui 到 ui 线程中,以根据我得到的硬件数据定期设置一些 ui 元素。

  5. 还不能从数据库中获取数据,但用户界面必须对硬件数据做出反应,硬件数据由第二个异步线程轮询。

  6. 在 METH_UI_1 我调用 manualresetEvent.WaitOne();

有时我会遇到异常,后台工作人员很忙,无法同时运行多个任务。

a) 真的需要 ManualResetEvent 对象吗?

b)当后台工作人员不再忙时,检查 isBusy 属性以便仅发出 WaitOne() 就足够了吗?


更新:代码。

MainForm.cs(第三方硬件供应商、组件的事件处理程序,在 ui 线程中处理)

runworkerasynch 这样做:

BackGroundWorker 的 WorkCompleted EventHandler:

0 投票
1 回答
699 浏览

c# - EventHandle.WaitOne + WebBrowser = 等待 DocumentComplete 时出现死锁

我遇到了 C# 程序中 WebBrowsing 自动化的问题。我之前使用过 BHO 的代码,它在那里工作。但是在纯 c# 程序中似乎存在某种死锁。我已经指示我的程序单击搜索按钮,然后等待(通过手动重置事件)让 documentcomplete 发出信号。但是现在似乎直到 ManualResetEvent 发出超时信号才处理对搜索按钮的单击。此后,单击并触发 DocumentComplete-Event。

对于该程序的结构: WebBrowser-Control 是 WindowsForm 的一部分。WebBrowser 控件被传递给运行线程的类。该类再次将控制权传递给另一个类,在该类中根据加载的网络浏览器对具体行为进行编程。

所以在代码中是这样的:

  1. 线程的设置

    /li>
  2. Runner-Method的处理

    /li>
  3. PlaceTipp 方法

    /li>
  4. 发生死锁的 SearchTipp-Method:

    /li>

有人知道这里发生了什么吗?

谢谢

光之使者

0 投票
2 回答
1360 浏览

c# - ManualResetEvent 与 while 循环

ManualResetEvent 基本上对其他线程说“只有在收到继续信号时才能继续”,并用于暂停某些线程的执行,直到满足某些条件。我想问的是,当我们可以通过使用while循环轻松实现我们想要的东西时,为什么ManualResetEvent?考虑以下上下文:

有点类似于

是否有任何特定的上下文ManualResetEvent 比while 循环更合适?

0 投票
2 回答
1767 浏览

c# - ManualResetEvent WaitOne 阻塞了我的 CollectionView 的所有者线程

我编写了一个 WPF WizardFramework,它使用一些BackgroundWorker. 在处理时可能会发生我必须更新ObservableCollection绑定到我的 UI 的内容。

对于这种情况,我编写了一个,它为和ThreadableObservableCollection提供线程安全方法。虽然我使用的是 .NET 4.5,但如果没有许多其他无效访问异常,我就无法开始工作。我的样子:InsertRemoveRemoveAtBindingOperations.EnableCollectionSynchronizationCollection

当我在我的应用程序中使用向导时,这按预期工作。现在我正在使用 NUnit 为应用程序编写一些集成测试。

有一个监听器等待 WizardViewModel 完成它的工作并寻找注入到 Steps-Collection 中的一些页面。异步工作完成后,我可以使用 Validate 检查视图模型状态。

不幸的是,我正在使用 aManualResetEvent等待向导关闭。如下所示:

现在有一个问题:当应用程序运行时,UI 线程没有被阻塞,集合可以更新而没有任何问题。但是在我的测试用例中,我初始化 ViewModel 的“主”线程(因此是集合)是一个被测试代码阻止的 AppDomainThread。现在我ThreadsafeInsert想更新集合但不能使用 AppDomain 线程。

但是我必须等待向导完成,我该如何解决这种死锁?或者有一个更优雅的解决方案吗?

编辑: 我通过检查是否有用户界面来解决这个问题,然后我才在应用程序线程上调用,否则我故意在另一个线程上更改集合。这并不能阻止异常,但不能从测试中识别出来……尽管如此,项目还是被插入了,只有NotifyCollectionChanged-Handler 没有被调用(它只在 UI 中使用)。

这是一个丑陋的解决方法,我仍然对干净的解决方案感兴趣。

有没有办法使用备用调度程序来创建(例如)整个 ViewModel 并使用它来更改我的集合?

0 投票
2 回答
2449 浏览

windows - setEvent 在没有 ResetEvent 的情况下被调用

如果使用 setEvent 设置了手动重置事件但未使用 ResetEvent 重置,会发生什么情况;并且该事件被多次触发。即在处理事件时,再次设置事件。

以下是示例任务:

现在,假设当 hEvent1 的情况正在执行时(即它仍然设置),不知何故再次触发了 hEvent1。我故意不放 ResetEvent(hEvent1) 即使它是手动复位事件。那么,我们有竞争条件吗?