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

c# - 如何使用 WaitHandle 等待异步调用完成?

考虑这段代码:

我们有结果:

所以,我想要结果:

我怎么能async在这段代码中等待?我查看了 MSDN 文章“异步调用同步方法”,发现:

调用后,BeginInvoke您可以执行以下操作:

  • 做一些工作,然后调用EndInvoke阻塞直到调用完成。
  • WaitHandle使用该IAsyncResultAsyncWaitHandle
    属性获取 a ,使用其WaitOne方法阻止执行,直到
    WaitHandle发出信号,然后调用EndInvoke.
  • 轮询 IAsyncResult返回的 byBeginInvoke以确定异步调用何时完成,然后调用EndInvoke.
  • 将回调方法的委托传递给BeginInvoke. 当异步调用完成时,该方法在ThreadPool线程上执行。回调方法调用EndInvoke.

我认为这一秒对我来说更好。但是如何实现呢?特别是我对重载感兴趣WaitOne()阻塞当前线程,直到当前 WaitHandle 收到信号)。如何正确地做到这一点?我的意思是这种情况下的常见模式。

更新:

现在我使用Task<T>

SomeMethod()这是空的主要问题list

结果: 在此处输入图像描述

现在我有可怕的解决方案:(

结果:

在此处输入图像描述

这就是我需要等待异步调用的原因。我如何WaitTask这里使用?

更新 2:

0 投票
2 回答
9191 浏览

c# - 等待信号量的正确方法是什么?

我认为下面的代码会让所有 10 个线程运行,一次运行两个,然后在Release()调用 10 次后打印“done”。但事实并非如此:

输出:

如果实现我正在寻找的功能的唯一方法是将 a 传递EventWaitHandle给每个线程,然后WaitAll()在这些数组上执行 a ,那么在只有一个信号量的数组上EventWaitHandles执行 a 的含义是什么?WaitAll()换句话说,等待线程什么时候解除阻塞?

0 投票
1 回答
1375 浏览

c# - C# WaitHandle 可取消的 WaitAll

我有以下代码,其目标是等待所有给定的等待句柄,但可以通过特定的等待句柄取消:

这仅适用于 ManualReset 事件。使用 AutoReset 事件时,WaitAny 会重置所有信号事件,但仅返回第一个信号事件(根据 MSDN)。

任何想法如何在不轮询的情况下以适当的方式使用 AutoReset 事件完成此操作?

0 投票
2 回答
79 浏览

.net - 在 .Net 中,我如何使用 Waithandles 执行和/或操作

我有一个数组WaitHandle[],对应于在线程可以继续之前所有需要完成的任务。但是我还有另一个 WaitHandle 会在用户请求中止时发出信号。

那么让线程等待的最有效方法是什么:

  1. 数组 WaitHandle[] 中的所有 WaitHandles 都发出信号;或者

  2. 用户中止 WaitHandle 是否发出信号?

0 投票
1 回答
684 浏览

c# - C# 等待回调的句柄

我的一些方法有问题,我认为 WaitHandle 是解决方案。

我通过 API 到 Ticketsystem 创建一个事件。

此方法在 create_Incident 方法中作为回调调用。

我需要 if 中的消息,但我需要安全性,即有消息。所以我必须等待 InsertIncidentCallback 和消息。

在另一种方法中,我问,如果消息正常:

如何实现回调的 WaitHandle?在这种情况下,WaitHandle 是正确的选择吗?

0 投票
1 回答
3969 浏览

c - 为什么 WaitForSingleObject 会错过信号?

WaitForSingleObject即使已发出事件信号,有时也会等待超时。

SetEvent()信令线程每次都收到成功。但是,发出信号的线程并不总是能听到信号。如果我向信号线程添加冗余SetEvent(),问题就会消失。

显然这里有些不对劲。可能的原因是什么?

并且应该等待延迟时间收到信号。但并不总是得到信号。

0 投票
1 回答
1464 浏览

c# - WaitHandle 是最佳选择吗?

我正在开发一个 MVC 应用程序,它在幕后使用一些 Windows 工作流来实现自动化。

我已经实现了一些代码来等待工作流完成。下面是一个示例应用程序,将问题归结为关键部分。

这个问题实际上与 WF 活动中正在进行的工作无关,而更多的是我如何等待它完成。

家庭控制器.cs

索引.cshtml

示例代码活动.cs

我的问题是关于控制器操作中的 WaitHandle/ManualResetEvent。有没有更好的方法来使用任务等来实现这一点?我正在使用.NET 4.5。

如果没有 WaitHandle,Action 会在工作流完成之前返回。

我熟悉 WaitHandle,但感觉就像一个笨拙的解决方案。

任何帮助/指导表示赞赏。

0 投票
1 回答
1327 浏览

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 个连接?是否有一些我没有看到的完全不同的处理方式?

0 投票
2 回答
4467 浏览

c# - AutoResetEvent 作为 C# 中的锁替换?

我想知道:锁定只允许 1 个线程进入代码区域

等待句柄用于发信号: :

信号是当一个线程等待,直到它收到来自另一个的通知。

所以我心想,这个可以用来代替锁吗?

就像是 :

所以我写了这个:

如您所见:第 21 行、第 24 行是锁的替代品。

问题 :

  • 它是有效的替代品吗?(不是我会替换lock ,而是想知道使用场景)
  • 我应该什么时候使用每个?

谢谢你。

奇怪但SO不包含关于_lock vs EventWaitHandle_

0 投票
1 回答
141 浏览

c# - 任务调度和 WaitHandles

我试图让多个任务消耗来自并发集合的对象,但仅在特定资源可用时。

为了表明此资源的可用性,我使用了 ManualResetEvent,我的任务主体如下所示:

但是,我注意到,从锁定解锁的那一刻到重新安排任务的那一刻,我可能有几百毫秒的时间可以重新启动任务而它们不是,可能是因为它们根本没有被安排。

我正在使用 TaskFactory 启动任务,我该如何改善这种行为?有没有更好的策略在资源不可用时暂停任务?