问题标签 [manualresetevent]

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 回答
4423 浏览

.net - 带参数的单例延迟初始化

我正在尝试创建一个具有非空构造函数的单例并以同步方式访问它:因为我无法控制组件的初始化顺序,如果组件在初始化之前访问单例,它必须等待。

工厂方法只调用一次,我的初始化阶段抛出异常

[OnWorkerThread] 是使工厂在工作线程上运行的属性,并且工厂只被调用一次。

当我启动 myapp 时,有时我会得到以下信息:

异常源:mscorlib 异常类型:System.Runtime.InteropServices.SEHException 异常消息:外部组件已引发异常。异常目标站点:WaitOneNative

---- 堆栈跟踪 ---- System.Threading.WaitHandle.WaitOneNative(waitableSafeHandle As SafeHandle, millisecondsTimeout As UInt32, hasThreadAffinity As Boolean, exitContext As Boolean) AddinExpress.RTD.2005.dll: N 00000 (0x0) JIT System。 Threading.WaitHandle.InternalWaitOne(waitableSafeHandle As SafeHandle, millisecondsTimeout As Int64, hasThreadAffinity As Boolean, exitContext As Boolean) AddinExpress.RTD.2005.dll: N 0020 (0x14) IL System.Threading.WaitHandle.WaitOne(millisecondsTimeout As Int32, exitContext As布尔值)

我做错了什么?

0 投票
1 回答
205 浏览

c# - WinXP 嵌入式上的 ManualResetEvent 问题

我在使用带有超时参数的 ManualResetEvent 类时遇到问题。此问题专门发生在 WinXP 嵌入式平台上。该代码在其他 Windows 平台上完美运行。我正在与 TCP 服务器通信。在我的客户端代码中,我连接到服务器并生成一个新线程,我的工作是持续监控接收套接字的数据。我在主线程中发送数据。代码片段附在下面:

我已经强调了代码的重要方面。据观察,WaitOne(timeout) 函数在大多数 Windows 操作系统上都可以正常工作。但是在 XP 嵌入式上,我观察到一个问题。WaitOne 几乎立即返回,没有从接收线程接收到数据。

我所做的是通过将 -1 传递给 WaitOne,将超时设置为 INFINITE。在这种情况下,我可以解决问题。但这会产生其他副作用(例如,如果服务器关闭,那么 WaitOne 永远不会返回!)

有人可以帮我解决这个问题吗?

0 投票
2 回答
1887 浏览

c# - 执行回调之前控制台应用程序退出

我有一个执行类方法的控制台应用程序(在不同的项目中)。此方法异步执行到 web 服务的 POST(这是一个 3 分钟的冗长操作),并有一个回调,返回受 POST 影响的记录数。与此同时,程序继续执行其他花费不到 3 分钟的事情,并且程序在回调返回之前退出。

在过去,我使用了如下所示的 ManualResetEvent 来防止完成,但在这种情况下,我的方法位于另一个类库中,我希望尽可能保持干净。

我将不胜感激提出一个干净的模式来实现这一点,而不会用执行标志污染被调用的类。

0 投票
1 回答
1879 浏览

objective-c - 如何在objective-c中的指定时间唤醒线程

我在objective-c中编写一个ssh包装器,我正在尝试实现一个命令应该执行的maxTime。我实现它的方式是:

主线:

  1. 计算超时
  2. 创建 asyncThread(GCD 队列)执行命令并解析返回的数据
  3. 等待超时或信号
  4. 返回结果

异步线程:

  1. 执行命令
  2. 获取返回的数据
  3. 如果接收到正确的数据信号 MainThread

在 C# 中,我使用 ManualResetEvents 向 MainThread 发出信号,取得了很大的成功。在 Objective-C 中,我能找到的最接近的类是 NSCondition,但它似乎不是为线程间通信而构建的。

事实上我得到:

2012-05-22 00:31:05.761 libssh2-for-iOS[60821:11303] ** -[NSCondition unlock]: 条件 ('(null)') 从未锁定的线程中解锁

2012-05-22 00:31:05.763 libssh2-for-iOS[60821:11303] ** 中断 _NSLockError() 以进行调试。

当我尝试使用它时。是否有另一种使用 NSCondition 的方法或更好的方法让线程休眠,直到它收到某种信号?

0 投票
2 回答
1865 浏览

sockets - 异步客户端套接字 ManualResetEvent 阻止执行

我正在尝试利用 MSDN 的异步客户端套接字代码示例来连接和控制一些家用设备。据我了解,示例代码的ReceiveCallback方法使用 EventWaitHandle ManualResetEvent的实例和方法receiveDone.WaitOne()来保持当前线程的处理,直到线程接收到所有套接字数据已从远程设备传输的信号. 传输完所有套接字数据后(套接字数据为空且bytesRead = 0),Waithandle 被移除,应用程序继续处理。

不幸的是,通过逐步执行代码,似乎在客户端最后一次从远程设备返回数据之后,ReceiveCallback永远不会返回查看数据队列是否为空(即 bytesRead = 0),因此永远不会在ReceiveCallback中进入“else”条件,其中ManualResetEvent的状态将被重置并且应用程序将继续处理。因此,由于它永远不会进入“else”条件,ManualResetEvent永远不会重置并且应用程序会冻结。

虽然我可以从代码中删除“receiveDone.WaitOne()”方法——允许执行而无需等待ManualResetEvent通知已收到所有数据;这会从设备返回一个通常不完整的数据字符串。

我是否错误地使用了此代码示例?有没有人以前见过这个或有任何关于如何解决这个问题的经验?

2012 年 7 月 14 日 - 更新:在进一步测试 MSDN 的异步客户端套接字示例后,很明显ReceiveCallback实际上重新轮询端口,并且只有在释放套接字时才满足“bytesRead = 0”条件(即客户端。关机(SocketShutdown.Both);client.Close();)。如果我理解正确,这意味着必须关闭连接才能通过 receiveDone.WaitOne() 方法。如果连接被关闭以满足 WaitOne() Waithandle,它完全违背了应用程序的目的,因为我一直希望保持连接打开,以便应用程序可以监听设备更新,这些更新会不断发生。

2012 年 7 月 16 日 - 更新:我已写信给Microsoft 技术支持,他们回复说“我们正在研究这个问题。我们可能需要一些时间才能回复您。” 因此,目前似乎无法通过按摩此代码来解决此挑战。

如果没有异步客户端套接字示例代码作为编写异步通信程序的基础,请问是否有人可以建议一个更可靠的替换例程? 共有三台设备,每台都有自己的 IP 地址和端口号。因此,如果可以使用一个类,为每个设备创建一个实例,那将是理想的。此外,端口必须保持打开状态才能接收设备不断发送的自发更新。最后,更新没有结束字符或定义的长度表示消息传输完成,因此例程必须不断轮询端口以获取可用数据。 任何意见或建议将不胜感激。

2012 年 7 月 18 日 - 解决方法:在花费大量时间尝试使MSDN 的异步客户端套接字代码示例正常工作后,很明显我必须寻找其他地方才能让程序持续识别设备响应。为了挽救其他人的脑损伤,我已经包含了我使用的解决方法,到目前为止似乎效果很好。如果有人有任何建议,请不要犹豫,添加到这个问题!

这是我使用的解决方法:

和 GC_Interface 类:

0 投票
1 回答
745 浏览

windows-phone-7 - WP7 上带有 HttpWebRequest 的 ManualResetEvent

首先,这可能被标记为以下线程的副本: Wait for HttpWebRequest.BeginGetResponse to finish in Windows Phone 7,但是,该线程中的响应并没有帮助我克服我的问题。

首先,我在 UI 线程上收集用户数据以处理应用程序注册,其中我还有一个 ManualResetEvent 实例:

我有另一个线程处理注册过程(包括 HttpWebRequest.BeginGetResponse() 及其相应的回调方法。)

在这个调用之后,我通过调用来阻塞当前(UI)线程

一旦处理注册过程的线程开始,我将实例化 HttpWebRequest 并在其上调用 BeginGetResponse() 方法。

现在的问题是回调方法(下面的代码)从未被调用,应用程序只是冻结。似乎也没有抛出任何异常。

理想情况下,我希望我的应用程序在回调方法完成执行后从 httpSessionCompleted() 继续。有人可以帮我一些指导/建议吗?

很抱歉很冗长。谢谢!

0 投票
1 回答
1070 浏览

c# - 在类之间传递 ManualResetEvent 对象

我的程序包含多个线程,我想使用单个 ManualResetEvent 对象来控制它们。当我创建一个新对象(例如 new ManualResetEvent MRE = new ManualResetEvent(args);)时,我希望所有类都可以访问 MRE,但是将它作为参数不断传递是很麻烦的。将其设为静态会更好吗?或者有没有更有效的方法?-谢谢

0 投票
1 回答
2651 浏览

c# - ManualResetEvent 的问题没有一致地释放所有等待的线程

我正在尝试实现一个使用简单缓存来保存从内部服务检索到的数据的类。我正在使用 ManualResetEvent 来阻止多个线程,这些线程可能会尝试同时刷新缓存的数据,第一个线程成功地向其他线程发出信号,一旦通过调用 Set() 然后 Reset() 检索到数据就继续。在测试时,我注意到有时所有线程都被释放,有时 1 个或多个线程没有被释放并且被超时,几乎就像我在所有线程被释放之前调用 Reset 一样。有人可以解释我做错了什么吗?

我已经包含了下面代码的精简版本。

0 投票
1 回答
1401 浏览

c# - 条件事件等待/ManualResetEvent

我知道如何使用 ManualResetEvent 或同步原语(如 Monitor)来等待事件和/或锁,但我想知道是否有一种方法可以实现以下内容:

1) 等待 1000ms 让事件 X 发生

2) 如果事件发生在 1000ms 内,执行路径 A

3)否则,执行路径B

这基本上是一个条件等待函数,条件是我们必须等待多长时间,如果可能的话,实现它的最佳方法是什么?

0 投票
1 回答
803 浏览

c# - 子线程完成后主线程不继续

我正在尝试在我的应用程序中使用多线程。该方法test5尝试从 Internet 获取一些内容,而main线程在继续其他工作之前等待所有线程完成。

但是我的main线程在调用后没有回来test5,我的控制台线Done Inside!!thread all got back!!永远不会到达。

我该如何解决这个问题?