问题标签 [event-wait-handle]

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 投票
2 回答
123 浏览

c# - 使用 Dispatcher.BeginInvoke 使用 EventWaitHandle 进行调度

以下代码有两个线程,每个线程将 20 写入string str其相应的文本框。完成后,Thread t00发出Thread t01启动信号并将共享string stry更改为xThread t00应将 20 y写入文本框,并将Thread t0120 x写入另一个文本框。相反,Thread t00最终写 19 y和 1 x。但是,如果我Thread.Sleep()在设置 EventWaitHandle 之前添加一个,则可以解决我遇到的问题(我得到 20 x和 20 y),但是为什么呢?EventWaitHandle不应该只在循环完成后设置,有或没有Thread.Sleep().

在此处输入图像描述

0 投票
0 回答
190 浏览

c# - C# 在一个事件处理程序中,如何暂停执行并等待第二个事件触发?

我有一个 DLL,它将所有信息异步返回给多个事件处理程序。当我按下一个按钮时,我会调用 DLL 中的一系列函数,但在前一个函数触发事件处理程序之前,不应调用下一个函数。

有没有办法等待事件触发而无需附加事件处理程序并使用信号?通过所有事件处理程序分散流程将非常混乱且不容易遵循。如果代码本身在事件处理程序中,它必须知道它处于“什么模式”并执行不同的代码片段。正如我所说,非常混乱。

0 投票
2 回答
183 浏览

task-parallel-library - 为什么非等待任务阻塞

我正在启动 2 个任务,但没有await-ing 它们,其中一个取决于另一个。我试图理解为什么以下代码阻塞被截断。

如果我CPU-bound为我的两个任务创建任务它可以工作:

我还尝试将这两个任务放在与主线程不同的任务中,但它仍然会阻塞:

CPU-bound如果我在没有等待的情况下启动一项任务,这与开始一项新任务几乎没有什么不同吗?( Task.Run)

0 投票
1 回答
170 浏览

c# - EventWaitHandle waitOne() 导致我的工作线程暂停,直到它超时

我正在使用 EventWaitHandle() 处理程序。在等待 10 秒的 ButtonClick 事件中调用此处理程序。还有另一个工作线程在处理程序上接收到一些数据调用 Set() 。问题是 WaitOne() 在超时发生后返回 false。工作线程没有运行并且看起来像是被挂起,因此没有调用 Set()。超时结束后,我的工作线程恢复并调用 Set() 方法。为了验证我在没有 EventWaitHandle() 的情况下尝试检查我的工作线程是否真的需要 10 秒的时间,但它没有,并且 Set() 方法立即生效。我不确定为什么工作线程在我是 C# 新手中发生超时后运行。提前致谢

主窗口.xaml.cs

XYZDialogBox.cs

ABC.cs

0 投票
1 回答
233 浏览

c# - ManualResetEventSlim 信号是否会降低性能?

我正在使用 ManualResetEventSlim 在我的应用程序中使用信号机制,如果请求/秒为 100,它会很好。随着我增加请求/秒,它会变得更糟。

例子:

100 个请求/秒 -> 90% 的事务在 250 毫秒内完成,吞吐量(成功请求/秒)为 134。

150 请求/秒 -> 90% 的事务在 34067 毫秒内完成,吞吐量(成功请求/秒)为 2.2。

我使用 ConcurrentDictionary 如下所示:

下面给出的过程描述了对 ManualResetEventSlim 的需求(Api 解决方案 1Api 解决方案 2完全是:

  1. Api 解决方案 1(REST Api)收到一个请求,它在 ConcurrentDictionary 中针对一个添加一个元素(null,ManualResetEventSlim),并使用 async/await 调用第三方服务(SOAP)。第三方soap api返回确认响应,但实际响应待定。得到确认响应后,转到 ManualResetEventSlim.wait

  2. 一旦第三方处理了请求,它就会使用公开的方法调用Api 解决方案 2 (SOAP)并发送实际响应。Api 解决方案 2 通过发出 http 请求向Api 解决方案 1 (REST Api)发送响应,然后将数据插入数据库以进行审计日志。

  3. Api 解决方案 1将从响应字符串中获取密钥并更新 ConcurrentDictionary 中的响应字符串并设置信号。

  4. Api 解决方案 1在向客户端返回响应之前处理 ManualResetEventSlim 对象。

0 投票
0 回答
95 浏览

c# - 多线程环境中的最佳实践 EventWaitHandle.Dispose()

我正在创建一个小型记录器。为此,我有一个LogFile发布该Log(ILogCsvLine csvLine)方法的类 ( )。此方法将要记录的行添加到队列 ( linesToLog) 并设置一个触发器,该触发器已使用Logging(..)as 方法注册到 ThreadPool,只要有触发器和待处理的处理器时间,就应该在不同的线程上执行该方法。该Logging(..)方法正在写入要记录到给定文件的行。现在我遇到了问题,该Dispose()方法已被调用,而队列不为空,导致对该Logging(..)方法的调用,而triggerfileAccessLock已被处置。作为一个解决方案,我围绕这些进行了一些检查EventWaitHandles,并想知道是否有更好的可读性和更优雅的方式来做到这一点。

0 投票
0 回答
116 浏览

c# - 如何安全地处理 WaitHandle?

考虑这段代码:

null 合并运算符意味着从 thread1 访问 waitHandle 是安全的。设置引用类型的原子性(加上它被标记为 volatile)意味着在设置它之后访问 waitHandle 对线程 2 是安全的。 AutoResetEvent(实际上所有继承自 EventWaitHandle 的类)都说它是线程安全的。所以天真这应该都是线程安全的。

但是,如果线程 1 在 Thread2 关闭句柄时位于 Set() 方法内,这会导致未定义的行为/竞争条件吗?查看 .NET 参考实现中的代码,我看不到任何明显的机制可以防止这种情况发生。

Close 调用 Dispose,后者在 SafeWaitHandle 上调用 Close ,后者最终在 WinAPI 中调用 CloseHandle 。Set在 WinAPI 中调用SetEvent 。在这两种情况下,我都没有看到任何其他明显的线程机制,因此我可能最终会遇到一个线程在同一个句柄上调用 CloseHandle 另一个线程正在调用 SetEvent 的情况。如果先调用 SetEvent 没有问题,但如果先调用 CloseHandle 可能会导致问题?

我已经尝试阅读有关CloseHandleSetEvent的文档,但我仍然不清楚。

这是潜在的竞争条件/未定义的行为吗?如果是问题,正确的处理方法是什么?我总是可以将对 Set 和 Close 的调用包装在一个锁中,但是在另一个同步机制中包装对互斥锁的访问似乎很奇怪。

作为参考,我发现这个较旧的问题基本上是相同的问题。那里的指导是毕竟不要关闭手柄,但是链接的博客是一个死链接,并且 IDisposable 对象挂起而没有清理,因为它们在我的嘴里留下了不好的味道。这仍然是处理这个问题的正确方法吗?

0 投票
1 回答
111 浏览

c# - EventWaitHandle.Set,等待超时和释放线程数

来自文档(EventWaitHandle.Set

不能保证每次调用 Set 方法都会从重置模式为 EventResetMode.AutoReset 的 EventWaitHandle 中释放线程。如果两个调用靠得太近,以至于第二个调用发生在一个线程被释放之前,那么只有一个线程被释放。就好像第二次通话没有发生一样。此外,如果在没有线程等待且 EventWaitHandle 已发出信号时调用 Set,则该调用无效。

考虑以下代码

情况1

案例二

想象一下,两者Method1Method2被调用,然后AnyMethod在超时时及时释放一个线程Method1

在情况 1 和 2 中是否有关于线程释放的保证,或者Set方法行为通常适用于任何线程释放,当其中任何一个发生在另一个附近时?

0 投票
1 回答
70 浏览

powershell - EventWaitHandle 上的 PowerShell CloseHandle

我有两个 PowerShell 脚本。其中一个必须在某个时间点在另一个等待。以下是相关部分:

等待脚本.ps1:

SignallingScript.ps1:

它运作良好,我只是不确定是否应该$StopEventObject在任一脚本中调用诸如 CloseHandle 或 Close on 之类的东西。