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

c# - 这段代码 [理论上] 是线程不安全的吗?

我在编写的代码中遇到了奇怪的死锁。

这个想法是实现一个异步操作,它的Stop是同步的——调用者必须等到它完成。我已将完成实际工作的部分简化为简单的属性增量(++Value见下文);但实际上,调用了一个对线程非常敏感的重型 COM 组件。

我遇到的死锁是在Stop()我明确等待识别已完成操作的手动重置事件的方法中。

有什么想法我可能做错了吗?代码应该是独立的并且可以自行编译。

0 投票
1 回答
999 浏览

.net - 如何正确停止单线程 Windows 服务(onStop)?

我有一个用 VS 2010 / .NET 4.0 编写的 Windows 服务。

该服务遵循以下代码片段的方案:使用计时器,它每几分钟执行一些所需的行为。每隔几分钟执行一次“期望行为”的要求现在已经发展为大约需要 10 秒的工作。

我在该服务中只需要一个线程,没有理由创建多个线程,这就是为什么我将 Windows 服务称为单线程。

我担心的是,如果有人通过管理控制台停止服务,那么服务可能只是在这 10 秒的工作中偶尔执行。

我已经阅读了一些关于 SO 以及如何停止服务的内容,但有点迷失了。有时会创建 WorkerThreads,有时会创建 ManualResetEvents,但到目前为止,我还不能完全掌握 Windows 服务的最佳前进方向。

我在想我需要在 10 秒执行期间检查某种标志,然后只有在该标志没有告诉我应该停止时才继续。在 onStop 方法中,我可能需要等到处理正确完成。

理论就这么多;),但是我最好的前进方式是什么,同时考虑下面的代码片段?

谢谢大家!

0 投票
2 回答
406 浏览

c# - 使用 C# (Windows 8) 生成问题的静态变量

我不是一个用过的 C# 程序员,所以如果这很愚蠢,对不起:-)

我正在为 Windows 8 开发 C# 应用程序。我需要执行 Web 请求,因此,我有一个回调来处理请求数据。

我正在使用标准方法:

运行时,allDone(do_something 内部)未初始化。我什至添加了一个条件来比较 allDone 和 null,是的,它是 null。

“等待完成”消息永远不会被打印出来......

我究竟做错了什么?

谢谢

0 投票
0 回答
165 浏览

c# - 在方法中嵌入事件处理程序的缺点

有时,当我使用具有异步交互方法的程序集时(您调用一个方法,然后您得到一个带有答案的事件),我喜欢通过在方法中嵌入事件处理程序将它们转换为同步方法。

问题是; 我在其他任何地方都看不到这种代码,所以我有一种令人讨厌的感觉,即这种方法存在一些我错过的主要缺点,而其他人都看到了。那么你怎么看 - 写这样的代码可以吗?

嵌入连接事件的事件处理程序的登录方法的简单示例。

我还认为,这种类型的代码,即使实际方法可能变得有点复杂,也有助于保持封装具有大量事件的对象的类的简洁和易于阅读。

0 投票
2 回答
787 浏览

c# - 同步线程和事件

在我的控制台应用程序中,在线程中同步事件很困难。

应用程序以一些随机数的形式给出结果,然后是线程块,并且在发出EventWaihandle数据线程退出的信号后打印在控制台上。

目的是通过以下方式打印数据,例如

*随机数据

线程块

随机数据

线程块

……

线程退出

...*

样本输出

1234

线程 2 块

2345

线程 0 块

3456

线程 1 块

……

线程 1 退出

线程 4 退出

……

如何以这种方式在线程内同步线程和事件。

0 投票
1 回答
579 浏览

c# - ManualResetEvent - 这里怎么可能出现竞争条件?

我正在尝试确定是否可以使用ManualResetEvent此处来确保在并发环境中,myMethod()永远不会同时调用内部操作。

编辑- 注意我使用 ManualResetEvent 而不是 lock() 因为我希望能够添加超时,可能。

0 投票
2 回答
574 浏览

windows - 如何判断 Windows 内核事件对象是自动重置还是手动重置?

Windows 允许创建(命名的)事件对象

Event(Windows 中的同步原语)可以是 auto-reset 类型(在这种情况下,您可以说它是一种 semaphore),也可以是 manual-reset 类型,在这种情况下,它会一直保持设置,直到有人重置它。

现在,从CreateEventOpenEventSetEvent等的文档看来,一旦创建了事件,似乎无法确定它是自动重置还是手动重置。

我的情况是,一个进程创建了一个命名事件,而第二个进程必须对该事件进行操作(它传递了名称,然后打开事件并最终发出信号)。由于该事件应该始终是一个手动重置事件以使整个事情变得有意义,我希望在第二个过程中添加一个检查以确保它一个手动重置事件。有没有办法检查这个?

(是的,在我的情况下它更像是一个不错的选择,因为如果任何代码会创建一个自动重置事件然后将其传递给这个进程,这将是一个错误。但是错误发生了,如果我可以检测到它们。)

0 投票
1 回答
316 浏览

c# - 手动重置事件的运行方法问题

我正在构建一个使用的方法,但在我启动该方法ManualResetEvent后我无法让它运行。WaitOne这是我的方法代码。代码运行代码,直到它运行到wait.WaitOne()调用。谢谢!!

0 投票
1 回答
154 浏览

c# - 创建大量系统线程并等待 MRE 的影响?

我正在尝试修复一个非常大的应用程序中的内存峰值。虽然我不确定这会对记忆产生多大影响,但我注意到以下几点:

  • 应用程序使用自定义线程池来完成所有昂贵的任务
  • 应用程序将执行所有传入的任务
  • 任务可以由数千个子任务组成
  • 虽然线程池一次只会执行 {T} 个任务,并在开始新任务之前完全完成一个任务,但它确实会创建一个新的系统线程(线程类)并为添加到其中的每个子任务启动它
  • 子任务系统线程以线程启动方式启动,该线程启动会立即阻塞手动重置事件 (MRE),等待线程池插槽释放

因此,这个线程池可以创建数千个线程,但是在其他任务完成时,除了 30 个(或您配置的任何内容)之外的所有线程都将在 MRE 上被阻塞。

我的问题:


在 MRE 上阻塞的一千个线程会对内存/处理器产生什么影响?我没有太多时间来修复这个峰值,所以如果它是最小的,我宁愿留下这个问题,并在我有更多时间的时候在以后的补丁中修复它。

此外,这种行为在线程池中是典型的,还是听起来有缺陷(我倾向于有缺陷,但我没有足够好的背景来确定)。

0 投票
1 回答
2655 浏览

c# - 使用 CountdownEvent 和 ManualResetEvent 控制 ThreadPool 中的线程

我有以下多线程代码摘录,我一直在努力比较压缩副本和解压缩后的文件。该应用程序正在压缩一个包含可变数量的各种大小文件的文件夹,将文件复制到服务器并解压缩它们。然后对文件进行比较,并将此比较导出到ThreadPool.

这是当前的完整方法

到目前为止查看的有用资源:

发出信号并立即关闭 ManualResetEvent 是否安全?

停止 .NET ThreadPool 中的所有线程?

MSDN 倒计时事件

线程池逻辑要求:

  • 比较本地和服务器上的所有枚举文件
  • 如果散列不匹配,则从所有线程返回

以前的线程池代码

ObjectDisposedExceptions定期使用显示的先前代码。

我的问题是这样的:

  1. 当前方法是线程安全的吗?
  2. 逻辑合理吗?
  3. 任何关于性能或线程安全的改进想法
  4. 我在顶部的当前方法是否解决了以前的代码异常

我一直在测试这段代码,它一直在毫无例外地工作,但我正在寻找一些更有经验的反馈。