问题标签 [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.
c# - Webservice:AsyncCall 已完成:但 WaitOne() 仍在等待
- 我正在通过命令行 Exe 调用 WebService 方法。
- 此方法调用是异步调用,我在调用后使用 WaitOne。
- 我正在完成的方法中执行 ManualRest.Set()。
在异步方法在 10-20 分钟内返回的情况下,上述设置在 99% 的情况下都能正常工作,
当异步调用需要更多时间(例如 2-3 小时)然后未执行 WaitOne() 之后的代码时,就会出现问题。
我在 waitone() 之前和之后以及 Completed 事件中都写了日志,但是在 3 小时的异步调用之后,控件似乎没有恢复。
上面的任何帮助/指针...
谢谢。
c# - ManualResetEvent - WaitOne() 似乎在某些时候没有释放线程
我有一个多线程表单应用程序,这就是相关部分的设计方式:
线程 2(BatchPreviewAssistant 类)正在等待主界面线程传递图像加载任务。收到任务后,BatchPreviewAssistant 将任务分配给 N=5 个等待的 PrimaryLoader 线程并启用它们。PrimaryLoaders 作为无限循环运行,使用 2 个手动重置事件启动/停止:_startEvent 和 _endEvent。此外,还有一个包含 N 个手动重置事件 _parentSyncEvent 的数组,用于表示从 PrimaryLoaders 到 BatchPreviewAssistant 的处理结束。
所以通常每个 PrimaryLoader 都在 _startEvent.WaitOne() 等待。一旦 BatchPreviewAssistant 需要激活它们并运行 RunPrimaryLoaders(),它首先重置 _endEvent 和 _parentSyncEvents,然后设置 _startEvent。现在它阻塞在 WaitHandle.WaitAll(_parentSyncEvents _startEvent.Set() 导致所有 PrimaryLoader 继续。一旦每个 PrimaryLoader 完成,它在 _parentSyncEvent 中设置自己的事件,直到所有 5 个都设置完毕。此时所有 PrimaryLoader 都到达 _endEvent.WaitOne( ) 并等待。现在 _parentSyncEvents 已全部设置,这使得 BatchPreviewAssistant 能够继续。BatchPreviewAssistant 重置 _startEvent,然后设置 _endEvent 释放 PrimaryLoaders 并且它们返回到循环的开头。
批量预览助手:
主装载机:
这段代码在制作数百个这样的循环时效果很好,但我每隔一段时间就会遇到一个问题,特别是在压力测试期间。发生的情况是,当 BatchPreviewAssistant 设置 _endEvent.Set() 时,在 _endEvent.WaitOne() 处没有释放 PrimaryLoader;你可以看到我签入了 BatchPreviewAssistant 并看到事件确实设置了,但是 PrimaryLoaders 没有释放。
这种设计是否存在任何可能导致问题的明显问题?我可以看到一些尝试解决的方法,但是很高兴看到这种方法有什么问题。
以防万一我还在初始化和启动 PrimaryLoaders 的方式上提供信息。
请注意,一些不相关的代码已被删除以简化示例
补充:我同意样本太忙且难以理解。简而言之,就是这样:
wcf - WCF 异步 - 如何使用 ManualResetEvent
谁能告诉我如何在异步 wcf 服务中使用“ManualResetEvent”?我有一个控制台应用程序,它调用异步 wcf 服务,我想在“oncomplete”事件完成后关闭控制台应用程序。
如果可能,请给我一个样品。
提前致谢。
c# - 在 ManualResetEvent.WaitOne() 上捕获 ObjectDisposedException 是否安全?
这与发出信号并立即关闭 ManualResetEvent 是否安全?并可能为该问题提供一种解决方案。
假设我有一堆线程可能想要做同样的工作,但应该只允许一个线程去做,其他的应该等到工作人员完成并使用它的结果。
所以基本上我希望工作只完成一次。
更新: 让我补充一点,这不是可以使用 .net 4 的 Lazy<T> 解决的初始化问题。一次我的意思是每个任务一次,这些任务是在运行时确定的。从下面的简化示例中可能不清楚这一点。
稍微修改一下 Hans Passant 对上述问题的回答中的简单示例,我想以下是安全的。(与刚才描述的用例略有不同,但就线程及其关系而言,是等价的)
我想我的问题的核心是:
就内存屏障而言,对 WaitOne 的调用是否因 ObjectDisposedException 而中止,是否等同于对 WaitOne 的成功调用?
这应该确保其他线程对变量workResult的安全访问。
我的猜测:它必须是安全的,否则 WaitOne 怎么能安全地确定 ManualResetEvent 对象首先被关闭了?
c# - 这个后台线程队列是一个高性能的实现吗?
具体来说,我想知道:
ManualResetEvent 处于等待状态时会消耗资源吗?上下文切换的性能下降是否适用于处于等待状态的线程?
如果我可以选择使用多个各自工作较少的BackgroundThreadQueue,或者一个工作较多的BackgroundThreadQueue,并且我选择使用多个......等待线程队列会在它们不做任何事情时影响进程性能吗?
我应该在 C# 中使用更好的 FIFO 线程队列还是不同的锁定策略?
任何建议表示赞赏。
c# - ManualResetEvent 处于等待状态时会消耗 cpu 吗?
更具体地说,上下文切换的性能下降是否适用于处于等待状态的线程?
在什么条件或情况下,ManualResetEvent 或 WaitHandle 可能会消耗资源?
multithreading - ManualResetEvent.WaitOne 阻塞所有线程
我有以下代码
DownloadAsync 在哪里
所以我的问题是 downloadHandle.Set() 永远不会调用。但我不明白为什么?我为 DownloadAsync 创建了一个新线程,并且 downloadHandle.WaitOne() 不应该阻止他。
我需要的是创建一个同步方法而不是异步。
谢谢!
UPD:使用异步调用更新了源代码。
c# - ManualResetEvent 大小检查是否足以等待多个线程?
我目前正在为单个线程使用 ManualResetEvent 以等待多个线程将某些内容添加到线程管理器的队列中。如果线程管理器使用手动重置事件接收到信号,它将使添加的项目出列并进行进一步处理。我唯一的问题是,如果触发了多个集合,则不会处理其他队列项。(见B 点)
我在这里的解决方法是在A 点添加队列大小条件。是否有另一种方法来执行此操作以避免死锁?
注意:在使用 ManualResetEvent 的示例中给出的通常场景是单个线程上有多个线程等待(ManualResetEvent.Wait)事件,但这里是多个线程触发(ManualResetEvent.Set)事件。是否有其他用于此场景的类?
c# - 什么可能导致 EventWaitHandle.Set() 阻塞当前线程?
我在 ManualResetEvent 的一个实例上调用 Set 方法,它偶尔会死锁。我在文档中找不到任何内容表明这是一种阻塞方法。什么可能导致 MRE.Set 阻塞?
堆栈跟踪:
c# - 从 FileStream 读取两次
我有一个 GetServiceMap() 方法,它调用解串器然后打开流并从中读取一些东西。
问题是我有一个 GetAllGroups() 方法,它也通过同一个流调用反序列化器。
我将如何同步它?使用 ManualResetEvent 可能吗?
反序列化方法: