问题标签 [waithandle]

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 投票
4 回答
6800 浏览

c# - 在等待 WaitHandle 时运行消息循环

当 UI 线程等待 WaitHandle 或其他线程原语时,有什么方法可以处理所有 Windows 消息?

我意识到它可能会产生非常混乱的重入问题;无论如何我都想做。

编辑:等待发生在必须在 UI 线程上运行的复杂函数的中间。因此,将等待移至后台线程不是一种选择。(将功能一分为二会造成复杂且无法维护的混乱)

0 投票
2 回答
1077 浏览

.net - 出于性能分析目的,是否可以忽略对 WaitHandle.SignalAndWait 的调用?

我刚刚从 Red Gate 下载了 ANTS Performance Profiler的试用版,并且正在调查我团队的一些代码。我立即注意到 ANTS 报告有一段特定的代码占用了高达 99% 的 CPU 时间。

我对 ANTS 或一般性能分析完全不熟悉(也就是说,除了使用我确信是非常粗糙和不受欢迎的方法进行自我分析之外double timeToComplete = (endTime - startTime).TotalSeconds),所以我仍在摆弄应用程序和计算出它是如何使用的。但我确实打电话给负责该代码的开发人员,他的直接反应是“是的,它这么说并不让我感到惊讶;但是该代码调用 SignalAndWait [我可以自己看到,感谢 ANTS],它不使用任何 CPU,它只是坐在那里等待要做的事情。” 他建议我简单地忽略该代码并寻找我能找到的任何其他内容。

我的问题:SignalAndWait 是否确实不需要 CPU 开销(如果是,这怎么可能?),性能分析器认为它占用 99% 的 CPU 时间是否合理?我觉得这特别奇怪,因为如果它是 99%,这表明我们的应用程序经常处于空闲状态,不是吗?然而,它的表现最近变得相当低迷。

就像我说的,当谈到这个工具时,我真的只是一个初学者,我对 WaitHandle 类一无所知。因此,任何帮助我了解这里发生的事情的信息都将不胜感激。

0 投票
6 回答
2090 浏览

c# - 对于 Windows 服务,等待旋转或计时器哪个更好?

这个关于 Windows 服务定时器的问题让我想到:

假设我有(而且我确实有)一个正在等待WaitHandle的 Windows 服务,当它被唤醒时,它会像我在下面的流程图中显示的那样进入等待旋转

等待自旋图 http://www.86th.org/waitspin.jpg

我很好奇使用计时器是否会比等待自旋循环(有时称为自旋等待)更好。老实说,除了我自己的修补之外,我从未将计时器用于其他任何事情。

除非差异很大并且使用计时器的好处是惊人的,否则我没有任何转换的计划。但是,我对人们对这个项目未来发展的想法非常感兴趣。

让我知道这是否应该是一个维基

0 投票
2 回答
7941 浏览

c# - WaitHandle.WaitAny 和信号量类

编辑:即使问这个问题,我也想为暂时的精神错乱辩护,但当时这是有道理的(见下面的编辑2)。

对于 .NET 3.5 项目,我需要检查两种类型的资源(R1R2)的可用性。每个资源类型在任何时候都可以有(比如说)10 个实例。

当任一类型的资源可用时,我的工作线程需要唤醒(线程数量可变)。在早期的实现中,只有一种资源类型,我使用信号量来检查可用性。

现在我需要等待两个单独的信号量(S1S2)来跟踪资源的可用性。

然而,这有一个问题。从 MSDN 文档中WaitAny

如果在调用期间有多个对象被发出信号,则返回值是所有发出信号对象中索引值最小的发出信号对象的数组索引。

这表明我有可能在调用WaitAny. 因为signalledHandle将指示 s1 已发出信号,所以我将开始使用资源R1,并在完成后释放它。但是,由于我不知道S2是否已发出信号,因此此资源的可用性计数现在可能已关闭。如果这种情况发生 10 次,我的信号量将永久“空”,资源R2将不再使用。

处理这个问题的最佳方法是什么?我是否应该从使用两个信号量切换到简单的计数器和 AutoResetEvent 以在任一计数器更改时发出信号?我错过了一些更优雅的方法吗?

编辑 1:
根据 Ravadre 的说法,只有一个信号量会在WaitAny. 稍微修改他的例子似乎证实了这一点,但是有没有人可以指出我的一些官方文档指定了这一点?

编辑2:
我在回家的路上正在考虑这个问题。直到那时我才意识到,这必须是真的,WaitAny才有用。这个问题不仅限于信号量,而是几乎任何类型的同步对象,WaitAny几乎没有用处。

0 投票
2 回答
1815 浏览

.net - 互斥锁是否正确实施以及如何处置它?

我正在查看一些代码,其中一个代码分析 (fxCop) 警告让我非常困惑。该代码通过在类的开头创建变量来实现一些互斥锁,类似于:

fxCop 弹出一条消息,说我必须为该类实现 IDisposable ,因为 Mutex 类实现了它 - 这是警告CA1001。但是看着 Mutex 它没有处置方法。

事实证明,Mutex 使用SafeWaitHandle(它实现了 IDisposable - 猜测这就是 fxCop 正在接受的),但 mutex 实际上并没有通过标准的一次性模式处理它。它有一个私有方法,使用RuntimeHelpers.CleanupCode分配给委托,据我了解,这意味着它将在异常上运行。

这就提出了两个问题:

  1. 互斥量是否正确实施?如果 Mutex 中没有异常,则永远不会释放 SafeWaitHandle。
  2. 我应该在我的处置中调用什么来清理互斥锁?
0 投票
2 回答
3805 浏览

c# - WaitHandle.WaitAny() & WaitHandle.WaitAll() 使用问题

我的应用程序没有正确退出。我只是想打印连接总数,然后等待所有上传操作完成,然后优雅地退出。

下面是代码...

0 投票
2 回答
6496 浏览

c# - 我的 EventWaitHandle 说“访问路径被拒绝”,但它不是

快速总结我现在所知道的

我有一个EventWaitHandle我创建然后关闭的。当我尝试使用此 ctor重新创建它时,会引发“访问路径...被拒绝”异常。这种异常很少见,大多数时候它只是重新创建EventWaitHandle就好了。使用下面(由我)发布的答案,我可以EventWaitHandle.OpenExisting在引发异常的情况下成功调用并继续,但是,ctor forEventWaitHandle应该为我做到这一点,对吧?这不是out 参数createdNew用途吗?


最初的问题

我在同一台服务器上有以下架构、一个 Windows 服务和一个 Web 服务。Web 服务通过打开和设置 Windows 服务正在等待的等待句柄来告诉 Windows 服务它必须完成工作。

通常一切都完美无缺,我能够启动/停止 Windows 服务而不会出现任何问题。但是,有时当我停止 Web 服务然后重新启动它时,它会完全无法创建等待句柄,从而破坏了整个架构。

我特别需要找出是什么破坏了事件等待句柄并停止它。当等待句柄“中断”时,我必须重新启动 Windows,然后它才能再次正常运行,这显然不理想。

更新:抛出异常和问题日志

我在 Web 服务正在工作时重新启动了 Windows 服务,希望能引起问题,而且确实如此!一些班级名称已因企业匿名而被审查

大致时间线:

  • 11:53:09,937:Web 服务上打开现有等待句柄的最后一个线程,完成了它的工作(如终止与客户端的连接)

  • 12:00:30,234:Web 服务获得新连接,但尚未使用等待句柄。此连接的线程 ID 与 11:53 的最后一个连接的线程 ID 相同

  • 12:00:41,250:Windows 服务停止

  • 12:00:42,781:Windows 服务启动

  • 12:00:43,078:Windows 服务完成崩溃

  • 12:00:50,234:Web 服务实际上能够在其上打开等待句柄调用 Set(),而不会引发任何异常等。

  • 12:02:00,000:我尝试重新启动 Windows 服务,同样的异常

  • 12:36:57,328:任意等待 36 分钟后,我无需完全重启系统即可启动 windows 服务。


Windows 服务代码

初始化:

用途:

处置/关闭:


网络服务代码

初始化:

用途:

由于EventWaitHandle是 Web 服务上的成员变量,因此我没有任何专门关闭它的代码。EventWaitHandle实际上,上面发布了唯一与 web 服务交互的代码。


回想起来,我可能应该把Close()那个放在catch块里,而不是放在一个finally块里。我可能应该为 Web 服务做同样的事情,但我不认为它是必要的。

无论如何,谁能看到我做错了什么?将 close 语句放在 finally 块中是否至关重要?我是否需要手动控制Close()网络existing_ewh服务?

另外,我知道这是一个稍微复杂的问题,所以如果您需要任何其他信息,请告诉我,我会密切关注它并添加任何需要的信息或解释。

参考资料

0 投票
2 回答
784 浏览

mysql - AJAX - 定时 mySQL 查询(请等待屏幕)

我需要制作一个 AJAX 页面,在页面加载时查询数据库,然后每 5-10 秒查询一次。与此同时,我将显示某种等待页面(可能带有动画 gif 以让我的客户开心:))

我正在使用贝宝 IPN,所以在我等待交易清除时,它会在大多数情况下在用户返回之前清除,但有时不会。因此,如果有人有这样的代码或者可以向我指出这样的代码的方向,那就太好了。

0 投票
3 回答
1680 浏览

c# - 使用 AutoResetEvent 的生产者消费者

我正在尝试使用生产者消费者模式来处理和保存一些数据。我正在使用 AutoResetEvent 在两个电极之间发出信号,这是我拥有的代码

这是生产者函数

这是消费者功能

所以我的问题有时是 resultQueue.Dequeue() 抛出 InvalidOperation 异常,因为队列是空的。我不确定我做错了什么不应该阻止队列为空的 signal.WaitOne() 上面的信号吗?

0 投票
5 回答
1780 浏览

c# - 多线程 - 等待所有线程发出信号

我有一些场景,我需要一个主线程来等待,直到一组可能的超过 64 个线程中的每一个都完成了它们的工作,为此我编写了以下帮助程序实用程序,(以避免 64 个等待句柄限制WaitHandle.WaitAll()

但是,使用此实用方法,每个等待句柄仅在数组中的每个前一个已发出信号后才检查...因此它实际上是同步的,如果等待句柄是 autoResetEvent 等待句柄(一旦等待线程已被释放)

为了解决这个问题,我正在考虑将此代码更改为以下代码,但希望其他人检查它是否可以工作,或者是否有人发现它有任何问题,或者可以提出更好的方法......

提前致谢: