问题标签 [waithandle]
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# - Thread.Sleep(timeout) 和 ManualResetEvent.Wait(timeout) 有什么区别?
Thread.Sleep(timeout) 和 resetEvent.Wait(timeout) 都会导致执行暂停至少timeout
几毫秒,那么它们之间有区别吗?我知道 Thread.Sleep 导致线程放弃其时间片的剩余部分,因此可能导致睡眠时间比要求的时间长得多。ManualResetEvent 对象的 Wait(timeout) 方法是否有同样的问题?
编辑:我知道 ManualResetEvent 的要点是从另一个线程发出信号 - 现在我只关心指定超时的事件等待方法的情况,而没有其他调用者设置事件。我想知道按时唤醒是否比Thread.Sleep更可靠
asp.net - 读取txt存储在不同的
ASP.NET 应用程序。在按钮单击中,我正在访问一个文本文件并读取内容并存储在其他目的地。
虽然两个用户一次单击此按钮都会发生死锁(线程正在被其他进程使用)所以如何处理这个我想一一阅读每个用户可以任何一个建议的方法来处理。我希望处理等待句柄事件,因此任何人都可以为上述场景提供代码示例。
c# - 当某个 WaitHandle 正在调用 WaitOne 时,如何关闭应用程序?
WaitHandle
当某些对象可能处于当前阻塞调用的状态时,是否有一种标准方法可以“干净地”关闭应用程序WaitOne
?
例如,可能有一个后台线程以这样的方法旋转:
我认为没有明显的方法可以在不调用的情况下处理这个线程Thread.Abort
(据我所知,这是不鼓励的)。Close
但是,调用_request
对象 (an AutoResetEvent
) 会引发异常。
目前,运行此循环的线程将其IsBackground
属性设置为true
,因此应用程序似乎正常关闭。但是,由于WaitHandle
implements IDisposable
,我不确定这是否被认为是犹太洁食,或者该对象是否真的应该在应用程序退出之前被处置。
这是一个糟糕的设计吗?如果不是,通常如何处理这种情况?
c# - 如何在没有 STA 警告的情况下在 MSTest 中使用 WaitHandler.WaitAll?
WaitHandle.WaitAll()
使用 Visual Studio 的内置单元测试解决方案时,有没有办法进行单元测试。当我尝试在 Visual Studio 中运行使用此函数的测试时,测试失败,并且在检查测试结果时显示以下错误:
我希望能够对 的使用进行单元测试,WaitAll()
因为越来越多的 API 代码库现在正在转向一种IAsyncResult
模式,而不是其他进行多线程操作的方式。
编辑
根据 Anthony 的建议,这里有一个简单的辅助方法,可用于在单元测试环境中调用此类代码:
c# - 线程池/WaitHandle 资源泄漏/崩溃
我想我可能需要重新考虑我的设计。我很难缩小导致我的计算机完全挂起的错误的范围,有时会从 VS 2010 抛出 HRESULT 0x8007000E。
我有一个控制台应用程序(稍后将转换为服务),它处理基于数据库队列的文件传输。
我正在限制允许传输的线程。这是因为我们连接的某些系统只能包含来自某些帐户的一定数量的连接。
例如,系统 A 只能接受 3 个同时连接(这意味着 3 个单独的线程)。这些线程中的每一个都有自己独特的连接对象,因此我们不应该遇到任何同步问题,因为它们不共享连接。
我们希望循环处理来自这些系统的文件。因此,例如,我们将允许 3 个连接,每个连接最多可以传输 100 个文件。这意味着,要从系统 A 移动 1000 个文件,我们每个周期只能处理 300 个文件,因为允许 3 个线程,每个线程 100 个文件。因此,在此传输的整个生命周期中,我们将拥有 10 个线程。我们一次只能运行 3 个。因此,将有 3 个周期,最后一个周期将只使用 1 个线程来传输最后 100 个文件。(3 个线程 x 100 个文件 = 每个周期 300 个文件)
当前的架构示例是:
- System.Threading.Timer 每 5 秒检查一次队列,通过调用 GetScheduledTask()
- 如果没有什么,GetScheduledTask() 根本什么都不做
- 如果有工作,则创建一个ThreadPool线程来处理工作【工作线程A】
- 工作线程 A 看到有 1000 个文件要传输
- 工作线程 A 发现它只能有 3 个线程运行到它从中获取文件的系统
- 工作线程 A 启动三个新的工作线程 [B,C,D] 并转移
- 工作线程 A 等待 B,C,D
[WaitHandle.WaitAll(transfersArray)]
- 工作线程A看到队列中还有更多文件(现在应该是700)
- 工作线程 A 创建一个新数组以等待
[transfersArray = new TransferArray[3]
系统 A 的最大值,但可能因系统而异 - 工作线程 A 启动三个新的工作线程 [B,C,D] 并等待它们
[WaitHandle.WaitAll(transfersArray)]
- 重复该过程,直到没有更多文件要移动。
- 工作线程 A 表示它已完成
我正在使用 ManualResetEvent 来处理信号。
我的问题是:
- 是否有任何明显的情况会导致资源泄漏或我遇到的问题?
- 我是否应该在每次调用后遍历数组
WaitHandle.WaitAll(array)
并调用array[index].Dispose()?
- 此进程的任务管理器下的句柄计数缓慢上升
- 我正在从 System.Threading.Timer 调用工作线程 A 的初始创建。这会有什么问题吗?该计时器的代码是:
(一些调度类代码)
c# - 如何检查是否设置了 WaitHandle?
我有一个WaitHandle,我想知道如何检查 WaitHandle 是否已经设置。
注意:我可以添加一个 bool 变量,并且每当使用 Set() 方法时将变量设置为 true,但是这种行为必须在 WaitHandle 的某个地方构建。
感谢帮助!
vb.net - VB.NET 在超时后中止异步方法调用
VB.NET 2010、.NET 4
大家好,
我有一个 System.Timers.Timer 对象,它对其经过的事件做了一些工作:
我的问题是它所做的工作有时会卡住。部分工作是串行通信,因此它可能会在等待某物的响应时卡住。我已经稍微修改了我的串行通信代码,希望能解决这个问题。然而,这个计时器基本上是生产控制应用程序的心跳,如果它因任何原因停止是非常糟糕的。我在想设置一个故障安全超时可能会很好,这样,如果“工作”花费的时间太长,计时器可以重新启用自己并重试。我在想这样的事情:
将工作移入子例程并创建委托:
通过调用委托来调用工作,然后在 IAsyncResult 上使用 WaitOne(timeout) 来指定超时:
但是,我的问题是:如果 Work() 真的被卡在某个地方,这会导致问题吗?因为它会重新进入一个已经运行的子程序?如果 Work() 在超时后没有完成,有没有办法中止它?换句话说,如果在 WaitOne 之后 result.IsCompleted 为 False,就停止 Work() 的执行?
我不太了解这些东西,所以,任何意见将不胜感激。也许有一种我不知道的完全不同的方法来解决这个问题?
提前非常感谢!
我想补充一点:
虽然我打算按照 Hans 的建议进行一些重写,但我已经安排了一天的测试来尝试隔离这个错误的来源。到目前为止,它仅在运行已编译的应用程序时发生。我今天(和昨天)花了一些时间尝试在调试模式下运行时重现冻结,以便我可以添加一些断点并弄清楚发生了什么。到目前为止,该程序还没有在调试模式下冻结。我只是想知道调试环境是否有任何不同可以解释这一点。可能只是我很“幸运”,但我运行它的时间可能是程序在运行可执行文件时冻结的平均时间的三倍......再次,我很无知,但是调试环境有什么独特之处可以解释这一点吗?如果它冻结,我会再次更新。
c# - ManualResetEvent.Set() 什么时候可以返回 false?
根据 MSDN 文档,无论操作是否成功,ManualResetEvent(或任何 EventWaitHandle)上的 Set() 和 Reset() 都会返回一个布尔指示符。
在什么情况下这个调用会返回 false,如果是,我应该怎么做?
c# - 是否存在基本上首先调用 Reset 的 WaitOne 方法?
我正在使用 AutoResetEvent,其中可以对事件进行多个 Set 调用(异常处理)。有时会调用额外的 Set,因此当代码对 WaitOne 事件进行第二次调用时,它会直接通过,因为门已经打开。
解决方案是在 WaitOne 之前调用 Reset。有没有更清洁的解决方案,或者这是唯一的方法?示例代码:
处理完异常后,我需要再次调用 DoSomeWork,但由于 Set 可能已在多个异常中调用(或重新抛出异常),WaitOne 只是流过。
我的解决方案是始终在 WaitOne 之前调用 Reset。这是合适的解决方案、糟糕的设计,还是有不同类型的事件可以处理这种情况?
编辑:我刚刚将评论的重置(建议的解决方案)移到了事件旁边。
c# - 使异步调用同步
我试图同步一个异步调用。
常规(async)流程如下所示:
- 使用 telnet 向服务器询问数据:'Session.sendToTarget(message)'
- 该应用程序继续做其他事情....
- 当服务器应答准备好时,服务器发送结果。
- 应用程序获取结果并引发事件“OnDataReceived”
来自服务器的数据对于下一步至关重要,所以我想保留一切,直到收到。
同步流程应如下所示:
- 向服务器请求数据:Session.sendToTarget(message)
- 等到从服务器收到数据
使用 c#,我尝试将操作与“WaitHandle.WaitOne(TimeToWaitForCallback)”同步,但未成功,似乎 WaitOne 暂停了应用程序以接收传入消息(我也尝试过在其他线程中等待)。在 TimeToWaitForCallback 时间过去后,我收到了对 WaitOne 操作停止的传入消息。
我尝试使代码同步:
传入引发此代码:
有任何想法吗?