问题标签 [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.
c# - 如何使用 WaitHandle 等待异步调用完成?
考虑这段代码:
我们有结果:
所以,我想要结果:
我怎么能async
在这段代码中等待?我查看了 MSDN 文章“异步调用同步方法”,发现:
调用后,BeginInvoke
您可以执行以下操作:
- 做一些工作,然后调用
EndInvoke
阻塞直到调用完成。 WaitHandle
使用该IAsyncResultAsyncWaitHandle
属性获取 a ,使用其WaitOne
方法阻止执行,直到
WaitHandle
发出信号,然后调用EndInvoke
.- 轮询
IAsyncResult
返回的 byBeginInvoke
以确定异步调用何时完成,然后调用EndInvoke
. - 将回调方法的委托传递给
BeginInvoke
. 当异步调用完成时,该方法在ThreadPool
线程上执行。回调方法调用EndInvoke
.
我认为这一秒对我来说更好。但是如何实现呢?特别是我对重载感兴趣WaitOne()
(阻塞当前线程,直到当前 WaitHandle 收到信号)。如何正确地做到这一点?我的意思是这种情况下的常见模式。
更新:
现在我使用Task<T>
:
SomeMethod()
这是空的主要问题list
。
结果:
现在我有可怕的解决方案:(
结果:
这就是我需要等待异步调用的原因。我如何Wait
在Task
这里使用?
更新 2:
c# - 等待信号量的正确方法是什么?
我认为下面的代码会让所有 10 个线程运行,一次运行两个,然后在Release()
调用 10 次后打印“done”。但事实并非如此:
输出:
如果实现我正在寻找的功能的唯一方法是将 a 传递EventWaitHandle
给每个线程,然后WaitAll()
在这些数组上执行 a ,那么在只有一个信号量的数组上EventWaitHandles
执行 a 的含义是什么?WaitAll()
换句话说,等待线程什么时候解除阻塞?
c# - C# WaitHandle 可取消的 WaitAll
我有以下代码,其目标是等待所有给定的等待句柄,但可以通过特定的等待句柄取消:
这仅适用于 ManualReset 事件。使用 AutoReset 事件时,WaitAny 会重置所有信号事件,但仅返回第一个信号事件(根据 MSDN)。
任何想法如何在不轮询的情况下以适当的方式使用 AutoReset 事件完成此操作?
.net - 在 .Net 中,我如何使用 Waithandles 执行和/或操作
我有一个数组WaitHandle[]
,对应于在线程可以继续之前所有需要完成的任务。但是我还有另一个 WaitHandle 会在用户请求中止时发出信号。
那么让线程等待的最有效方法是什么:
数组 WaitHandle[] 中的所有 WaitHandles 都发出信号;或者
用户中止 WaitHandle 是否发出信号?
c# - C# 等待回调的句柄
我的一些方法有问题,我认为 WaitHandle 是解决方案。
我通过 API 到 Ticketsystem 创建一个事件。
此方法在 create_Incident 方法中作为回调调用。
我需要 if 中的消息,但我需要安全性,即有消息。所以我必须等待 InsertIncidentCallback 和消息。
在另一种方法中,我问,如果消息正常:
如何实现回调的 WaitHandle?在这种情况下,WaitHandle 是正确的选择吗?
c - 为什么 WaitForSingleObject 会错过信号?
WaitForSingleObject
即使已发出事件信号,有时也会等待超时。
SetEvent()
信令线程每次都收到成功。但是,发出信号的线程并不总是能听到信号。如果我向信号线程添加冗余SetEvent()
,问题就会消失。
显然这里有些不对劲。可能的原因是什么?
并且应该等待延迟时间或收到信号。但并不总是得到信号。
c# - WaitHandle 是最佳选择吗?
我正在开发一个 MVC 应用程序,它在幕后使用一些 Windows 工作流来实现自动化。
我已经实现了一些代码来等待工作流完成。下面是一个示例应用程序,将问题归结为关键部分。
这个问题实际上与 WF 活动中正在进行的工作无关,而更多的是我如何等待它完成。
家庭控制器.cs
索引.cshtml
示例代码活动.cs
我的问题是关于控制器操作中的 WaitHandle/ManualResetEvent。有没有更好的方法来使用任务等来实现这一点?我正在使用.NET 4.5。
如果没有 WaitHandle,Action 会在工作流完成之前返回。
我熟悉 WaitHandle,但感觉就像一个笨拙的解决方案。
任何帮助/指导表示赞赏。
c# - 等待多个 TcpClients 有可用的数据 - WaitHandle 或 Thread.Sleep?
我正在编写一个服务器应用程序,它将接收来自多个 TCP 连接的数据。我们希望能够扩展到约 200 个连接。我为此编写的第一个算法如下:
这工作得很好,虽然我发现我必须添加 Thread.Sleep 来减慢循环,否则它会占用整个核心,无论有多少或几个连接。我被告知 Thread.Sleep 通常被认为是不好的,所以我寻找了一些替代方案。在与此类似的问题中,建议我使用 WaitHandles 来使用 BeginRead 和 BeginAccept,因此我编写了一个算法来使用它来做同样的事情,并想出了这个:
这也很好,直到我打到 64 个客户。我写了一个限制,不接受超过 64 个客户端,因为这是 WaitAny 将接受的最大 WaitHandles 数量。我看不到任何绕过这个限制的好办法,所以我基本上不能像这样维持超过 64 个连接。Thread.Sleep 算法适用于 100 多个连接。
我也不太喜欢预先分配任意大小的接收数组,而不是在接收到数据后以接收到的数据的确切大小进行分配。而且我无论如何都必须给 WaitAny 一个超时,否则它会阻止运行它的线程在我关闭应用程序时加入(如果没有连接)。而且它通常更长,更复杂。
那么为什么 Thread.Sleep 是更糟糕的解决方案呢?有什么方法至少可以让 WaitAny 版本处理超过 64 个连接?是否有一些我没有看到的完全不同的处理方式?
c# - AutoResetEvent 作为 C# 中的锁替换?
我想知道:锁定只允许 1 个线程进入代码区域
等待句柄用于发信号: :
信号是当一个线程等待,直到它收到来自另一个的通知。
所以我心想,这个可以用来代替锁吗?
就像是 :
所以我写了这个:
如您所见:第 21 行、第 24 行是锁的替代品。
问题 :
- 它是有效的替代品吗?(不是我会替换
lock
,而是想知道使用场景) - 我应该什么时候使用每个?
谢谢你。
奇怪但SO不包含关于_lock vs EventWaitHandle_
c# - 任务调度和 WaitHandles
我试图让多个任务消耗来自并发集合的对象,但仅在特定资源可用时。
为了表明此资源的可用性,我使用了 ManualResetEvent,我的任务主体如下所示:
但是,我注意到,从锁定解锁的那一刻到重新安排任务的那一刻,我可能有几百毫秒的时间可以重新启动任务而它们不是,可能是因为它们根本没有被安排。
我正在使用 TaskFactory 启动任务,我该如何改善这种行为?有没有更好的策略在资源不可用时暂停任务?