问题标签 [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# - ManualResetEvent 会阻塞整个程序吗?
我有一个程序,它通过监听连接开始。我想实现一种模式,其中服务器将接受一个连接,将该单独的连接传递给用户类进行处理:未来的数据包接收和数据处理。
Socket
在我发现类的异步使用并不可怕之前,我遇到了同步模式的麻烦。但后来我遇到了更多的麻烦。看起来,在一个while (true)
循环中,由于BeginAccept()
是异步的,程序会不断地通过这个循环并最终运行到一个OutOfMemoryException
. 我需要一些东西来监听连接,并立即将该连接的责任移交给其他班级。
因此,我阅读了 Microsoft 的示例并了解了ManualResetEvent
. 我实际上可以指定何时准备好让循环再次开始收听!但是在阅读了有关 Stack Overflow 的一些问题后,我变得困惑。
我担心的是,即使我已经异步接受了一个连接,整个程序在重新进入循环时尝试侦听新连接时也会阻塞。如果我要处理多个用户,这并不理想。
我对异步 I/O 的世界很陌生,所以即使是对我的词汇或短语滥用的最愤怒的评论,我也会很感激。
代码:
c# - 如果队列未锁定,多线程的性能与全局队列的长度有关吗?
要求是:要处理的项目存储在一个全局队列中。几个处理线程从全局队列中获取项目进行处理。Producer线程连续快速地将item添加到全局队列(比所有dealer线程的处理速度快得多。另外,handler线程是计算密集型的。最好的性能是完全使用CPU)。所以,我再使用一个countKeeping 线程来将队列的长度保持在特定范围内,就像从BOTTOM到TOP大致一样(只是为了防止内存使用过多)。
我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线程主要是这样的
所以我的问题是
- 当我没有
lock
在countKeeping 线程中使用时,为什么全局队列的范围会在不同的 CPU 条件下影响性能(这里,性能主要是 CPU 利用率)? - 当我
lock
在countKeeping thread中使用时,在不同的条件下性能都很好。有什么lock
真正影响这一点? - 有没有更好的方法来改变“可以添加”状态而不是使用
ManualResetEvent
? - 有没有更好的模型适合我的要求?或者当生产者线程连续快速工作 时,有没有更好的方法来防止内存不被使用?
---更新---
生产者线程的主要部分如下。STEP是数据库中每个查询的项目数。依次查询,直到查询完所有项目。
c# - ManualResetEvent 被线程跳过
在这里,我有一个执行的代码块:
我希望在最后一行之后,打开窗口并停止进程本身,但是调用执行的线程只是一次又一次地迭代。关于我做错了什么的任何指示?
**更新如果我在syncEvent.WaitOne() 中设置时间,后台进程的调试屏幕以及UI 都会显示,除了UI 不可访问。有什么帮助吗?
**附加信息我想这样做,因为调用执行方法本身的线程是我无法访问的,我想停止该线程并显示它的一次迭代的 UI。所以它可能看起来像糟糕的编码,但这是我能想到的唯一方法。
**更新执行以下操作时:
屏幕确实显示并且执行线程正在等待,但屏幕上的任何内容都无法访问。有什么想法可以克服这部分吗?
c# - 带有 ManualResetEvent 的 foreach 中的计时器
当我单击按钮时,循环开始读取数据库并将查询的每一行发送到另一台服务器。当得到响应时 - 循环继续。
代码实现如下
和
问题是发送请求时可能不是答案。在我的情况下,这是正常的。但如果没有,答案就来了,然后循环停止。我需要在循环计时器内部进行,在由于缺乏响应而停止循环的情况下,它将在 30 秒内继续循环。
计时器将不得不做
c# - 使用关闭事件的 Windows 服务无法停止该服务
我编写了一个 Windows 服务,它尝试从 MSMQ 读取消息并处理它们。我在我的项目中添加了一个安装程序,并将启动设置为手动。我安装服务,然后通过服务工具启动它。然后我可以返回我的项目并附加到流程以逐步执行代码。
但是,无论我做什么,我都无法通过代码或服务工具停止服务。我只能认为这是因为我正在使用 ManualResetEvent 类来控制服务。这是我的代码。我正在尝试测试错误部分,因为此时它应该抛出错误并停止服务。
在我的服务课程中,我有:
当我单步执行代码时,它确实会按预期进入异常,此时我希望能够停止服务。
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 的内部流程吗
c# - 线程 ...开始/暂停 ..设置/重置
我一直在尝试修改其他人过去开发的应用程序...
这个应用程序进行在线交易(使用为 C# 开发的 api)..所以基本上我有应用程序结构,我设置了一些用户可以检查或取消选中的配置参数,并且有启动和停止按钮
在单击开始按钮时..我正在通过传递函数创建一个线程,该函数将执行所有 aping 和其他内容并将其分配给主表单类
并单击停止按钮,,,app 只是暂停线程
现在应用程序停止,恢复应用程序功能(aping)的唯一方法是按下开始按钮并重新启动线程..
作为一项新功能,我希望这个线程自动停止并重新启动......每次它达到一定的止损并重新开始......但我做不到
我厌倦的是ManualResetEvent如下
当某些事件在 aping_function 方法中匹配时,我会执行 mrse.reset() 和 mrse.set() ..但这似乎没有效果(没有完全重新启动)
我怎样才能做到这一点
c# - AutoResetEvent / ManualResetEvent 消耗哪些资源?
c# ManualResetEvent和AutoResetEvent类的创建或维护成本高吗?
它们是否消耗某种有限的 Windows 内核资源,如果是,它的限制程度如何?
例如,如果我有可以每 100 毫秒创建一个新的 AutoResetEvent 的代码(稍后将被释放),我是否应该担心将旧的 AutoResetEvents 放入池中并重用它们,或者这不是一个重要的问题?
由于它们是 IDisposables,我认为它们消耗某种有限的资源。它们到底消耗了多少,我应该在什么时候开始担心使用太多?
有一个 ManualResetEventSlim,但没有 AutoResetEventSlim 的事实也让我有点担心。
c# - 如何使用 ManualResetEvent 替换此类中的布尔标志
我用相同的代码提出了一个先前的问题,并被建议使用ManualResetEvent
,因为这是做我想做的事情的正确方法,我同意这一点。
问题是:我已经阅读并重新阅读了有关ManualResetEvent
、WaitOne
、和方法的文档和许多教程Set
,但坦率地说,我不太了解它们应该如何使用。Unset
Reset
我的代码做了什么:它一直在寻找连接的设备,当它找到一个时,它会不断验证它是否仍然连接(否则,重新开始寻找)。这是“监控”活动,可以通过客户端代码使用Start
和Stop
方法来启动或停止。还有一个_busy
标志,因此该Stop
方法仅在一个监视周期完成后才返回。
事实是:目前 bool 标志方法不起作用,所以我想用ManualResetEvent
方法替换它,但甚至不知道如何开始。
- 我应该一对一地用 ManualResetEvents 替换标志吗?
- 应该
SearchDevices()
和MonitorDeviceConnection()
方法有条件地在同一个线程中运行,还是应该每个都有(或是)自己的线程? Start
和Stop
(打开和关闭,从客户端代码调用)和两种监视方法之间的“选择”之间的区别如何影响每个 ManualResetEvent 的使用方式?(不太确定这个问题是否有意义)- 使用枚举标志来选择两种可能的执行路径之一是一种代码味道,不是吗?
ManualResetEvent
在“上下文”中摆脱它的明智方法是什么?
这是代码:
c# - 退出应用程序时使用 UnsafeRegisterWaitForSingleObject 失败并出现异常?
如果某些应用程序退出,我正在尝试使用它ThreadPool.UnsafeRegisterWaitForSingleObject
来通知。它至少可以按我想要的方式工作,但是在我关闭主窗体后,它会抛出异常:
SEHException : 外部组件抛出异常
堆栈跟踪:
这是代码:
我什至不需要等待回调被调用,只需运行代码,然后关闭主窗体就会抛出异常。
有趣的是,如果使用OpenProcess
本机函数来获取进程句柄而不是使用这样的Process
类:
然后它可以正常工作,没有任何例外,但我不确定在这种情况下是否最好尽可能地坚持托管包装器。另外我想了解为什么在使用Process
类时会引发此异常。看起来Synchronize
标志(记录中的必需标志)是使 usingOpenProcess
和 wrapper 不同的原因Process
。如果在这种情况下看起来Process
无法替换OpenProcess
,或者我在这里错过了什么?
其他信息:Visual Studio 2010,面向 .NET 4.0
谢谢你。