问题标签 [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 回答
126 浏览

.net - 使用哪个锁定原语?

昨天我发现我们使用的一个简单缓存对象存在多线程问题:

我们在我们的 asp.net 网站上发现了这个问题。消息中的错误信息类似于“您试图向已经存在的哈希表添加值。从上面的代码中可以看出,这种情况发生的可能性肯定会退出。我对等待句柄有些熟悉,并认为它们会解决问题. 所以我在班级级别声明了我的等待句柄:

然后在有问题的特定代码部分:

由于某种原因,上面的以下代码总是被阻止。即使是第一个线程也访问了代码。我玩了一段时间,甚至尝试在构造函数中将等待句柄设置为发出信号,但我永远无法让它工作。

我最终改用以下方法,效果很好:

所以我有两个问题:

  1. 为什么等待句柄解决方案不起作用?
  2. SynLock 是在这种情况下使用的正确/优化的锁类型吗?
0 投票
4 回答
3003 浏览

c# - 在时间限制内杀死进程的逻辑

我想确保我的逻辑在这里是正确的。我想运行一个进程timeout几秒钟,如果它运行更长时间,它应该立即被杀死。

completed标志应该可靠地指示进程是否按预期完成,例如没有被杀死,没有崩溃或抛出异常。

process.HasExited另外,如果检查正确,我也不肯定。如果process.WaitForExit()返回 false 并Kill()成功,那么将process.HasExited 永远为 true?那将是我的假设,但我想确认。另外,如果 Kill() 失败,除了记录之外,如果有什么可以做的呢?

0 投票
1 回答
634 浏览

c# - 使用等待句柄

我正在尝试做这样的事情:

在代码的其他地方,会有调用的方法:

所以 LongRunningOperation() 被执行..

问题是,handler.Set()可以在AsyncWait()线程运行时再次调用LongRunningOperation()

这使得当仍在执行LongRunningOperation()时被调用时将永远不会被调用handler.Set()AsyncWait()LongRunningOperation()

如何做到这一点?:(

0 投票
2 回答
413 浏览

c# - 等待事件从它产生的后台线程在主线程上触发

我有一种情况,我正在处理最初从事件触发的线程中的一些数据,但它需要等到主线程中发生某些事情才能继续 - 问题是可能有任意数量的这些数据同时运行。真正的基本示例:

事件触发 -> 方法设置为在自己的线程上在后台运行 -> 使用主线程的发送数据方法发送数据 -> 等待接收该数据的 ACK -> 在主线程上设置 WaitHandle -> 工作线程然后将发送下一组数据 -> 重复 -> 当所有数据都已发送并确认后退出线程。

目前我有一个 AutoResetEvent ,每次收到 ACK 时都会设置 - 并且正在运行的工作线程会监听它 - 但如果碰巧有 10 个工作线程同时运行,并且它们都在监听它 -它违背了目的。

我需要生成工作线程,并让它侦听(WaitOne)以设置/重置特定的 WaitHandle,并仅基于此继续。

完成这样的事情的最佳方法是什么?以某种方式创建一个 WaitHandles 数组并让工作线程侦听其索引的 AutoResetEvent?

0 投票
3 回答
14865 浏览

c# - AutoResetEvent.WaitOne with timeout vs Thread.Sleep

I need a solution to perform arbitrary pause. The delay accuracy is irrelevant. What is the practical difference in such scenario between WaitHandle.WaitOne Method (TimeSpan) and Thread.Sleep Method. Are there any better solutions?

0 投票
2 回答
2470 浏览

c# - C# 块控制台应用程序关闭

我尝试停止控制台应用程序关闭,但它在所有功能完成之前关闭。例如停止到 90000,然后控制台关闭。我希望它首先完成所有工作,然后关闭控制台。对不起我的英语不好。

例子:

0 投票
2 回答
1546 浏览

c# - 为基本线程同步处理 WaitHandle

根据文档,.NET 中的 WaitHandle 应该显式/隐式处理。但是,对于以下基本同步任务,我无法实现这一点:

  • 一个耗时的任务正在线程上执行。
  • 主线程在预定义的时间段内等待任务完成。如果 a. 主线程必须继续。任务完成或 b. 发生超时。

这里我尝试使用 AutoResetEvent 对象:

有一个明显的竞争条件,主线程等待超时并释放导致 ObjectDisposedException 异常的等待句柄对象。有没有其他方法可以设置它以便正确处理句柄并且不会导致异常?

0 投票
1 回答
949 浏览

c# - 同时以异步方式等待服务器对不同调用的响应

我正在通过 TCP 为模型铁路控制器编写客户端库。服务器嵌入在控制单元中。

当客户端向服务器发送命令时,例如set(5, addr[3])服务器以回复头响应,<REPLY set(5, addr[3])>该命令的结果以及是否有错误。

因为所有这些东西都是异步的,所以我必须将回复与命令相匹配。(即使客户端只发送一个命令然后等待响应也有服务器端事件)

为了给这个库提供一个良好且易于理解的界面,我使用了该async await模式。await client.Set(5, "addr", "3")这意味着客户端代码会在服务器发回响应并由客户端代码评估响应后继续调用代码。

我目前正在使用IDictionary<string, EventWaitHandle>字符串是命令的地方来实现这一点,并且在方法中等待SendeBefehlAwaitResonse(string befehl)EventWaitHandleawait Task.Run(() => signal = e.WaitOne(timeout));

有没有更常见的方法来做到这一点?对于NetworkClient,我还首先使用了 EventWaitHandle 来等待新消息发送(并使用我的 MessageDelay)属性。我发现使用无限循环调用await Task.Delay(100);具有更好的性能。

问题:

  • 有没有更好的方法来等待服务器响应?也许使用Reactive Extensions或其他一些库?

如果我必须重写部分库,这对我来说没什么大不了的。我写这个库主要是为了学习。尽管代码(主要是 TCP 客户端)在某种程度上是被黑客入侵的代码,但我尽我所能为项目提供更好且易于理解的结构。

在此先感谢您的帮助!

你可以在这里找到代码:https ://github.com/schjan/RailNet | 消息调度程序类

0 投票
1 回答
418 浏览

.net - 如何使 WaitHandle.WaitAny 不优先处理具有较小索引的句柄?

WaitAny()文档说:

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

换句话说,它不会“公平”地对待句柄,即选择一个发出时间最长的信号(我猜是一厢情愿),或者至少,只是选择一个随机发出信号的,这样随着时间的推移,公平性至少是统计提供。

我当然可以WaitAny()在每次调用时为我的等待句柄列表(循环或随机)提供不同的排列:

但是没有更聪明的方法可以做到这一点吗?

(最初,我正在检查BlockingCollection.TryTakeFromAny()方法是否公平。由于它们基于WaitHandle.WaitAny,它们也不公平。)

0 投票
1 回答
1115 浏览

c# - 使用带有 WaitAny() 的 WaitHandles 数组

程序设置一个等待定时器。那部分工作正常。线程一直阻塞,直到定时器触发。我想做的是能够在其中一个 WaitHandles 上调用 .Set 以释放线程阻塞。似乎这段代码的编写方式 .Set 不可用,所以我现在已经注释掉了该行。我需要能够调用其中一个计时器以释放线程阻塞。有谁知道如何做到这一点?

我现在遇到的问题是我对 set 的调用以:

错误 1“System.Threading.WaitHandle”不包含“Set”的定义,并且找不到接受“System.Threading.WaitHandle”类型的第一个参数的扩展方法“Set”(您是否缺少 using 指令或程序集参考?) C:\Users\Eric\Documents\Visual Studio 2013\Projects\waitany\ConsoleApplication1\Program.cs 86 38 ConsoleApplication1