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

c# - ManualResetEvent 会阻塞整个程序吗?

我有一个程序,它通过监听连接开始。我想实现一种模式,其中服务器将接受一个连接,将该单独的连接传递给用户类进行处理:未来的数据包接收和数据处理。

Socket在我发现类的异步使用并不可怕之前,我遇到了同步模式的麻烦。但后来我遇到了更多的麻烦。看起来,在一个while (true)循环中,由于BeginAccept()是异步的,程序会不断地通过这个循环并最终运行到一个OutOfMemoryException. 我需要一些东西来监听连接,并立即将该连接的责任移交给其他班级。

因此,我阅读了 Microsoft 的示例并了解了ManualResetEvent. 我实际上可以指定何时准备好让循环再次开始收听!但是在阅读了有关 Stack Overflow 的一些问题后,我变得困惑。

我担心的是,即使我已经异步接受了一个连接,整个程序在重新进入循环时尝试侦听新连接时也会阻塞。如果我要处理多个用户,这并不理想。

我对异步 I/O 的世界很陌生,所以即使是对我的词汇或短语滥用的最愤怒的评论,我也会很感激。

代码:

0 投票
1 回答
1043 浏览

c# - 如果队列未锁定,多线程的性能与全局队列的长度有关吗?

要求是:要处理的项目存储在一个全局队列中。几个处理线程从全局队列中获取项目进行处理。Producer线程连续快速将item添加到全局队列(比所有dealer线程的处理速度快得多。另外,handler线程是计算密集型的。最好的性能是完全使用CPU)。所以,我再使用一个countKeeping 线程来将队列的长度保持在特定范围内,就像BOTTOMTOP大致一样(只是为了防止内存使用过多)。

ManualResetEvent用来处理“可以添加到队列”状态更改。全局队列是

处理程序线程

生产者线程将调用 AddToQueue() 函数将项目添加到 mQueue。

countKeeping线程主要如下

问题来了。
当我将 BOTTOM 和 TOP 设置为较小的数字时,例如 BOTTOM = 20,TOP = 100,它适用于四核 CPU(CPU 利用率高),但对于单 CPU 则效果不佳(CPU 利用率波动较大。 )。
当我将 BOTTOM 和 TOP 设置为更大的数字时,例如 BOTTOM = 100,TOP = 300,它适用于单 CPU,但不适用于四核 CPU。
两种环境,两种情况,内存都没有使用太多(最多50M左右)。

从逻辑上讲,更大的 BOTTOM 和 TOP 将有助于提高性能(当内存没有使用太多时),因为有更多的项目供处理程序线程处理。但事实似乎并非如此。

我尝试了几种方法来找到问题的原因。而且我刚刚发现,当我用于lock(mQueue)保持线程时,它在上述两种 CPU 条件下都能正常工作。
新的countKeeping线程主要是这样的

所以我的问题是

  1. 当我没有lockcountKeeping 线程中使用时,为什么全局队列的范围会在不同的 CPU 条件下影响性能(这里,性能主要是 CPU 利用率)?
  2. 当我lockcountKeeping thread中使用时,在不同的条件下性能都很好。有什么lock真正影响这一点?
  3. 有没有更好的方法来改变“可以添加”状态而不是使用 ManualResetEvent
  4. 有没有更好的模型适合我的要求?或者当生产者线程连续快速工作 时,有没有更好的方法来防止内存不被使用?

---更新---
生产者线程的主要部分如下。STEP是数据库中每个查询的项目数。依次查询,直到查询完所有项目。

0 投票
1 回答
100 浏览

c# - ManualResetEvent 被线程跳过

在这里,我有一个执行的代码块:

我希望在最后一行之后,打开窗口并停止进程本身,但是调用执行的线程只是一次又一次地迭代。关于我做错了什么的任何指示?

**更新如果我在syncEvent.WaitOne() 中设置时间,后台进程的调试屏幕以及UI 都会显示,除了UI 不可访问。有什么帮助吗?

**附加信息我想这样做,因为调用执行方法本身的线程是我无法访问的,我想停止该线程并显示它的一次迭代的 UI。所以它可能看起来像糟糕的编码,但这是我能想到的唯一方法。

**更新执行以下操作时:

屏幕确实显示并且执行线程正在等待,但屏幕上的任何内容都无法访问。有什么想法可以克服这部分吗?

0 投票
1 回答
903 浏览

c# - 带有 ManualResetEvent 的 foreach 中的计时器

当我单击按钮时,循环开始读取数据库并将查询的每一行发送到另一台服务器。当得到响应时 - 循环继续。

代码实现如下

问题是发送请求时可能不是答案。在我的情况下,这是正常的。但如果没有,答案就来了,然后循环停止。我需要在循环计时器内部进行,在由于缺乏响应而停止循环的情况下,它将在 30 秒内继续循环。

计时器将不得不做

0 投票
1 回答
1448 浏览

c# - 使用关闭事件的 Windows 服务无法停止该服务

我编写了一个 Windows 服务,它尝试从 MSMQ 读取消息并处理它们。我在我的项目中添加了一个安装程序,并将启动设置为手动。我安装服务,然后通过服务工具启动它。然后我可以返回我的项目并附加到流程以逐步执行代码。

但是,无论我做什么,我都无法通过代码或服务工具停止服务。我只能认为这是因为我正在使用 ManualResetEvent 类来控制服务。这是我的代码。我正在尝试测试错误部分,因为此时它应该抛出错误并停止服务。

在我的服务课程中,我有:

当我单步执行代码时,它确实会按预期进入异常,此时我希望能够停止服务。

0 投票
0 回答
1065 浏览

c# - 调用 ManualResetEvent.WaitOne 时究竟会发生什么?

最近我遇到了一个 MSDN 链接,它说与 ManualResetEvent 类相比,ManualResetEventSlim 类可用于获得更好的性能。

“在 .NET Framework 4 中,当预期等待时间非常短时,您可以使用 System.Threading.ManualResetEventSlim 类来获得更好的性能”。

https://msdn.microsoft.com/en-us/library/5hbefs30%28v=vs.110%29.aspx

如果我的理解有误,请纠正我。

当 WaitOne(1000) 被调用 1 秒时

  • 窗口除了阻止其他线程执行外,还会使当前线程休眠一段时间,并在收到通知时唤醒。

  • 这里阻塞一词的意思是线程休眠一段时间,直到收到通知?

  • 这句话是什么意思 - “当等待时间预计很短时”?

    有人可以建议任何网站来了解 WaitOne 的内部流程吗

0 投票
1 回答
323 浏览

c# - 线程 ...开始/暂停 ..设置/重置

我一直在尝试修改其他人过去开发的应用程序...

这个应用程序进行在线交易(使用为 C# 开发的 api)..所以基本上我有应用程序结构,我设置了一些用户可以检查或取消选中的配置参数,并且有启动和停止按钮

在单击开始按钮时..我正在通过传递函数创建一个线程,该函数将执行所有 aping 和其他内容并将其分配给主表单类

并单击停止按钮,,,app 只是暂停线程

现在应用程序停止,恢复应用程序功能(aping)的唯一方法是按下开始按钮并重新启动线程..

作为一项新功能,我希望这个线程自动停止并重新启动......每次它达到一定的止损并重新开始......但我做不到

我厌倦的是ManualResetEvent如下

当某些事件在 aping_function 方法中匹配时,我会执行 mrse.reset() 和 mrse.set() ..但这似乎没有效果(没有完全重新启动)

我怎样才能做到这一点

0 投票
1 回答
613 浏览

c# - AutoResetEvent / ManualResetEvent 消耗哪些资源?

c# ManualResetEventAutoResetEvent类的创建或维护成本高吗?

它们是否消耗某种有限的 Windows 内核资源,如果是,它的限制程度如何?

例如,如果我有可以每 100 毫秒创建一个新的 AutoResetEvent 的代码(稍后将被释放),我是否应该担心将旧的 AutoResetEvents 放入池中并重用它们,或者这不是一个重要的问题?

由于它们是 IDisposables,我认为它们消耗某种有限的资源。它们到底消耗了多少,我应该在什么时候开始担心使用太多?

有一个 ManualResetEventSlim,但没有 AutoResetEventSlim 的事实也让我有点担心。

0 投票
1 回答
553 浏览

c# - 如何使用 ManualResetEvent 替换此类中的布尔标志

我用相同的代码提出了一个先前的问题,并被建议使用ManualResetEvent,因为这是做我想做的事情的正确方法,我同意这一点。

问题是:我已经阅读并重新阅读了有关ManualResetEventWaitOne、和方法的文档和许多教程Set,但坦率地说,我不太了解它们应该如何使用。UnsetReset

我的代码做了什么:它一直在寻找连接的设备,当它找到一个时,它会不断验证它是否仍然连接(否则,重新开始寻找)。这是“监控”活动,可以通过客户端代码使用StartStop方法来启动或停止。还有一个_busy标志,因此该Stop方法仅在一个监视周期完成后才返回。

事实是:目前 bool 标志方法不起作用,所以我想用ManualResetEvent方法替换它,但甚至不知道如何开始。

  • 我应该一对一地用 ManualResetEvents 替换标志吗?
  • 应该SearchDevices()MonitorDeviceConnection()方法有条件地在同一个线程中运行,还是应该每个都有(或是)自己的线程?
  • StartStop(打开和关闭,从客户端代码调用)和两种监视方法之间的“选择”之间的区别如何影响每个 ManualResetEvent 的使用方式?(不太确定这个问题是否有意义)
  • 使用枚举标志来选择两种可能的执行路径之一是一种代码味道,不是吗?ManualResetEvent在“上下文”中摆脱它的明智方法是什么?

这是代码:

0 投票
1 回答
285 浏览

c# - 退出应用程序时使用 UnsafeRegisterWaitForSingleObject 失败并出现异常?

如果某些应用程序退出,我正在尝试使用它ThreadPool.UnsafeRegisterWaitForSingleObject来通知。它至少可以按我想要的方式工作,但是在我关闭主窗体后,它会抛出异常:

SEHException : 外部组件抛出异常

堆栈跟踪:

这是代码:

我什至不需要等待回调被调用,只需运行代码,然后关闭主窗体就会抛出异常。

有趣的是,如果使用OpenProcess本机函数来获取进程句柄而不是使用这样的Process类:

然后它可以正常工作,没有任何例外,但我不确定在这种情况下是否最好尽可能地坚持托管包装器。另外我想了解为什么在使用Process类时会引发此异常。看起来Synchronize标志(记录中的必需标志)是使 usingOpenProcess和 wrapper 不同的原因Process。如果在这种情况下看起来Process无法替换OpenProcess,或者我在这里错过了什么?

其他信息:Visual Studio 2010,面向 .NET 4.0

谢谢你。