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

c# - Webservice:AsyncCall 已完成:但 WaitOne() 仍在等待

  1. 我正在通过命令行 Exe 调用 WebService 方法。
  2. 此方法调用是异步调用,我在调用后使用 WaitOne。
  3. 我正在完成的方法中执行 ManualRest.Set()。

在异步方法在 10-20 分钟内返回的情况下,上述设置在 99% 的情况下都能正常工作,

当异步调用需要更多时间(例如 2-3 小时)然后未执行 WaitOne() 之后的代码时,就会出现问题。

我在 waitone() 之前和之后以及 Completed 事件中都写了日志,但是在 3 小时的异步调用之后,控件似乎没有恢复。

上面的任何帮助/指针...

谢谢。

0 投票
2 回答
2529 浏览

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 的方式上提供信息。

请注意,一些不相关的代码已被删除以简化示例

补充:我同意样本太忙且难以理解。简而言之,就是这样:

0 投票
1 回答
1770 浏览

wcf - WCF 异步 - 如何使用 ManualResetEvent

谁能告诉我如何在异步 wcf 服务中使用“ManualResetEvent”?我有一个控制台应用程序,它调用异步 wcf 服务,我想在“oncomplete”事件完成后关闭控制台应用程序。

如果可能,请给我一个样品。

提前致谢。

0 投票
3 回答
2633 浏览

c# - 在 ManualResetEvent.WaitOne() 上捕获 ObjectDisposedException 是否安全?

这与发出信号并立即关闭 ManualResetEvent 是否安全?并可能为该问题提供一种解决方案。

假设我有一堆线程可能想要做同样的工作,但应该只允许一个线程去做,其他的应该等到工作人员完成并使用它的结果。

所以基本上我希望工作只完成一次。

更新: 让我补充一点,这不是可以使用 .net 4 的 Lazy<T> 解决的初始化问题。一次我的意思是每个任务一次,这些任务是在运行时确定的。从下面的简化示例中可能不清楚这一点。

稍微修改一下 Hans Passant 对上述问题的回答中的简单示例,我想以下是安全的。(与刚才描述的用例略有不同,但就线程及其关系而言,是等价的)

我想我的问题的核心是:

就内存屏障而言,对 WaitOne 的调用是否因 ObjectDisposedException 而中止,是否等同于对 WaitOne 的成功调用?

这应该确保其他线程对变量workResult的安全访问。

我的猜测:它必须是安全的,否则 WaitOne 怎么能安全地确定 ManualResetEvent 对象首先被关闭了?

0 投票
2 回答
455 浏览

c# - 这个后台线程队列是一个高性能的实现吗?

具体来说,我想知道:

ManualResetEvent 处于等待状态时会消耗资源吗?上下文切换的性能下降是否适用于处于等待状态的线程?

如果我可以选择使用多个各自工作较少的BackgroundThreadQueue,或者一个工作较多的BackgroundThreadQueue,并且我选择使用多个......等待线程队列会在它们不做任何事情时影响进程性能吗?

我应该在 C# 中使用更好的 FIFO 线程队列还是不同的锁定策略?

任何建议表示赞赏。

0 投票
2 回答
1464 浏览

c# - ManualResetEvent 处于等待状态时会消耗 cpu 吗?

更具体地说,上下文切换的性能下降是否适用于处于等待状态的线程?

在什么条件或情况下,ManualResetEvent 或 WaitHandle 可能会消耗资源?

0 投票
4 回答
2768 浏览

multithreading - ManualResetEvent.WaitOne 阻塞所有线程

我有以下代码

DownloadAsync 在哪里

所以我的问题是 downloadHandle.Set() 永远不会调用。但我不明白为什么?我为 DownloadAsync 创建了一个新线程,并且 downloadHandle.WaitOne() 不应该阻止他。

我需要的是创建一个同步方法而不是异步。

谢谢!

UPD:使用异步调用更新了源代码。

0 投票
2 回答
794 浏览

c# - ManualResetEvent 大小检查是否足以等待多个线程?

我目前正在为单个线程使用 ManualResetEvent 以等待多个线程将某些内容添加到线程管理器的队列中。如果线程管理器使用手动重置事件接收到信号,它将使添加的项目出列并进行进一步处理。我唯一的问题是,如果触发了多个集合,则不会处理其他队列项。(见B 点

我在这里的解决方法是在A 点添加队列大小条件。是否有另一种方法来执行此操作以避免死锁?

注意:在使用 ManualResetEvent 的示例中给出的通常场景是单个线程上有多个线程等待(ManualResetEvent.Wait)事件,但这里是多个线程触发(ManualResetEvent.Set)事件。是否有其他用于此场景的类?

0 投票
1 回答
1015 浏览

c# - 什么可能导致 EventWaitHandle.Set() 阻塞当前线程?

我在 ManualResetEvent 的一个实例上调用 Set 方法,它偶尔会死锁。我在文档中找不到任何内容表明这是一种阻塞方法。什么可能导致 MRE.Set 阻塞?

堆栈跟踪:

0 投票
1 回答
852 浏览

c# - 从 FileStream 读取两次

我有一个 GetServiceMap() 方法,它调用解串器然后打开流并从中读取一些东西。

问题是我有一个 GetAllGroups() 方法,它也通过同一个流调用反序列化器。

我将如何同步它?使用 ManualResetEvent 可能吗?

反序列化方法: