问题标签 [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 投票
1 回答
113 浏览

c# - WaitHandle 基本行为

在查看控制台时,这两个代码块是否具有相同的效果?
请注意:目前我仍在使用并绑定到 .NET 3.5。

第一的:

第二:

waitHandle 会随着每个信号而增加吗?循环会一直运行到所有信号都完成吗?或者当线程已经在工作时会忽略信号吗?

有人可以为此带来一些启示吗?

0 投票
0 回答
698 浏览

c# - 等待进程终止或停止,然后从服务重新启动

在我的 C# 应用程序中,我要求服务将持续监视进程。如果进程被某种方式或用户杀死或停止,则必须启动它。并且该服务将启动/重新启动该过程。我能够从一个进程启动一个 exe,如果该进程被用户杀死,或者有任何机会服务将重新启动该进程。但是我这里有个问题。

我是怎么做到的

我有 StartProces 里面的 AppLoader 代码,它有一个 WIn 32 APICreateProcessAsUser

这是开始这个​​过程。

现在,当我的服务第一次启动时,进程启动但如果我终止进程它没有启动,所以我知道我必须使用WaitForMultipleObject Win32 API并完成它。我在 google 中查到了,但没有代码示例WaitForMultipleObject,谁能帮我展示WaitForMultipleObject.

谢谢

0 投票
3 回答
2076 浏览

c# - 如何等待2中的第一个:一个进程和一个EventWaitHandle

我想 WaitForMultipleObjects 两种不同的类型:

  • 一个“事件等待句柄”
  • 一个'Process.Handle' ==> intptr

我不知道如何(以适当的方式)将“process.Handle”转换为 WaitHandle 以使以下代码正常工作:

我收到错误:

有人知道等待进程和 EventWaitHandle 的正确方法吗?

更新...我选择答案的原因。

首先感谢所有人:Jaroen、Slugart 和 Sriram。所有的答案都非常好。

  • Jaroen 解决方案由于我忽略的原因在我的机器上不起作用。我的“退出”事件从未发生(也许仅在 Disposed 上?)。
  • Slugart 解决方案效果很好,我在红色答案之前尝试了它。
  • Sriram 解决方案效果很好,我选择了它,因为我没有创建错误的 EventWaitHandle,并且根据我的愿景似乎更干净。

十分感谢!!!

0 投票
1 回答
4424 浏览

c# - 使用 WaitHandle.WaitOne

我正在尝试创建一个 Windows 服务,该服务每 5 分钟轮询一次系统并检查需要完成的某些操作。我已经阅读了WaitHandles它们在这方面的用处,但需要了解它是如何工作的。

请参见下面的代码:

上面的代码似乎应该从我的研究中得到,但我不明白这!cancel.WaitHandle.WaitOne(interval)部分。这如何让循环每五分钟等待一次?我需要了解这部分代码来完成我的脚本,或者知道我在使用 WaitHandle 时是否完全错误。

这就是我想到的地方:Creating ac# windows service to poll a database

0 投票
0 回答
52 浏览

multithreading - 许多线程(大多数等待信号) - 大规模的性能影响?

解决争议的假设性问题。假设我有一台服务器和 1000 个活跃用户。当发生有趣的事情时,服务器将通过推送通知进行响应(这取决于每个用户。)

每个用户都可以订阅其他用户,因此当他们更新某些内容时,所有订阅的用户都会收到推送通知。

推送通知将由用户发送一个非常长的超时消息来实现,然后根据需要坐下来等待,直到服务器回复。服务器只会在发生有趣的事情时回复。

现在让我们假设拥有 1000 个对象并在它们之间触发事件是不可行的。当用户发出请求时,他将获得自己的线程,该线程执行一个循环以检查任何有趣的事情,然后等待直到适当的 WaitHandle 发出信号唤醒它并执行另一个循环。

这里的关键是让每个线程无限循环直到发生某些事情是不可行的,所以我们让它进入睡眠状态并等待信号。

如果只有大约 2-5% 的时间会发生有趣的事情 - 20-50 个活动线程随时醒来执行单个循环。将所有这些休眠线程放在那里会导致任何重大的性能问题。或者换句话说,程序是线性扩展还是指数扩展(在计算方面)?

0 投票
1 回答
283 浏览

c# - EventWaitHandle 是否必须处理虚假唤醒?

注意:我受限于 .NET 3.5,所以我不能使用ManualResetEventSlim.

做这样的事情时,我是否必须处理虚假唤醒:

如果是这样,调用时是否设置了正确的内存屏障Set和/或WaitOne这样是安全的:

reallyDone特别是,由于指令重新排序或缓存,此示例中的主线程是否可能看不到设置为 true?在这种情况下是否reallyDone需要易变还是没有必要?

0 投票
1 回答
238 浏览

c# - 等待后读取事件参数

我有一个用于 TCP 通信的硬件组件。控制它的类有 3 个工作:触发设备、监听传入消息并在收到消息event时引发:

此类在 a 内的循环中使用view-model

我所做的是触发设备并等待长达 10 秒的响应。我现在正在做的是持有一个类范围的字段,分配在事件侦听器内部接收到的消息,在循环内部读取它并清除它。
我的问题是是否有任何内置机制可以让我在EventWaitHandle发出信号后直接读取事件参数(在事件侦听器之外)。

0 投票
1 回答
613 浏览

c# - AutoResetEvent / ManualResetEvent 消耗哪些资源?

c# ManualResetEventAutoResetEvent类的创建或维护成本高吗?

它们是否消耗某种有限的 Windows 内核资源,如果是,它的限制程度如何?

例如,如果我有可以每 100 毫秒创建一个新的 AutoResetEvent 的代码(稍后将被释放),我是否应该担心将旧的 AutoResetEvents 放入池中并重用它们,或者这不是一个重要的问题?

由于它们是 IDisposables,我认为它们消耗某种有限的资源。它们到底消耗了多少,我应该在什么时候开始担心使用太多?

有一个 ManualResetEventSlim,但没有 AutoResetEventSlim 的事实也让我有点担心。

0 投票
1 回答
967 浏览

c# - 等待句柄和 Xamarin 表单

我目前正在使用 Xamarin 免费试用版开发概念验证应用程序,并且遇到了一个相当有趣的小问题......这是我在可移植类库中使用的代码:

本质上,我只是想针对 Web 服务调用并获得响应,但我注意到 Xamarin 无法使用旧方法执行此操作,而GetResponse()必须使用旧模式。嘘。BeginGetResponse()EndGetResponse()IAsyncResult

无论如何,我的问题是我等待之后waitHandle的代码在回调中的代码之前执行,我不明白为什么。这正是我们等待处理的原因!

谁能发现我确信会被一个傻瓜证明是一个简单的错误?

0 投票
1 回答
553 浏览

c# - 如何使用 ManualResetEvent 替换此类中的布尔标志

我用相同的代码提出了一个先前的问题,并被建议使用ManualResetEvent,因为这是做我想做的事情的正确方法,我同意这一点。

问题是:我已经阅读并重新阅读了有关ManualResetEventWaitOne、和方法的文档和许多教程Set,但坦率地说,我不太了解它们应该如何使用。UnsetReset

我的代码做了什么:它一直在寻找连接的设备,当它找到一个时,它会不断验证它是否仍然连接(否则,重新开始寻找)。这是“监控”活动,可以通过客户端代码使用StartStop方法来启动或停止。还有一个_busy标志,因此该Stop方法仅在一个监视周期完成后才返回。

事实是:目前 bool 标志方法不起作用,所以我想用ManualResetEvent方法替换它,但甚至不知道如何开始。

  • 我应该一对一地用 ManualResetEvents 替换标志吗?
  • 应该SearchDevices()MonitorDeviceConnection()方法有条件地在同一个线程中运行,还是应该每个都有(或是)自己的线程?
  • StartStop(打开和关闭,从客户端代码调用)和两种监视方法之间的“选择”之间的区别如何影响每个 ManualResetEvent 的使用方式?(不太确定这个问题是否有意义)
  • 使用枚举标志来选择两种可能的执行路径之一是一种代码味道,不是吗?ManualResetEvent在“上下文”中摆脱它的明智方法是什么?

这是代码: