WaitHandle.WaitAny 匹配 WaitForMultipleObjects 功能
Posted
技术标签:
【中文标题】WaitHandle.WaitAny 匹配 WaitForMultipleObjects 功能【英文标题】:WaitHandle.WaitAny to match WaitForMultipleObjects functionality 【发布时间】:2011-09-15 12:53:06 【问题描述】:我正在将C++ API
代码移植到.NET
并查看函数调用WaitHandle.WaitAny
作为WaitForMultipleObjects
的替代品,但是在使用.NET4
进行调试时,我可以看到这个函数被挂钩
private static extern int WaitMultiple(
WaitHandle[] waitableSafeHandle,
int msTimeOut,
bool exitContext,
bool WaitAll);
这让我觉得这个功能不适用于端口。还有其他建议吗?
【问题讨论】:
为什么不呢?它也允许指定多个等待句柄 为什么你认为 WaitAny 不适合? 【参考方案1】:WaitHandle.WaitAny()
确实不足以匹配WaitForMultipleObjects()
的功能。但是你也只需要使用WaitHandle.WaitAll()
。
WaitHandle.WaitAny()
与 WaitAll
参数设置为 FALSE
调用的 WaitForMultipleObjects()
匹配。
WaitHandle.WaitAll()
与设置为 TRUE
的 WaitAll
匹配。
【讨论】:
【参考方案2】:几乎相同的签名和行为,所以它是一个很好的候选者。如果用WaitAll=true
调用WaitForMultipleObjects()
,你也可以使用WaitHandle.WaitAll()
C++ WaitForMultipleObjects()
DWORD WINAPI WaitForMultipleObjects(
__in DWORD nCount,
__in const HANDLE *lpHandles,
__in BOOL bWaitAll,
__in DWORD dwMilliseconds
);
等到一个或所有指定的对象都在信号中 状态或超时间隔已过
C# WaitHandle.WaitAny()
public static int WaitAny(
WaitHandle[] waitHandles,
TimeSpan timeout,
bool exitContext
)
等待指定数组中的任何元素接收 信号,使用 TimeSpan 指定时间间隔并指定 等待前是否退出同步域。
.NET
提供了另一种方法WaitHandle.WaitAll(),但它在您需要确保所有句柄都收到信号时很有用。
【讨论】:
【参考方案3】:没关系,它在后台使用 WaitForMultipleObjects()。你可以通过这个小测试程序找到它:
using System;
using System.Threading;
class Program
static void Main(string[] args)
var waits = new WaitHandle[65];
for (int ix = 0; ix < waits.Length; ++ix) waits[ix] = new ManualResetEvent(false);
WaitHandle.WaitAny(waits);
与 WaitForMultipleObjects 具有相同的限制。 WaitMultiple() 方法被标记为 MethodImplOptions.InternalCall,因为它实际上存在于 CLR 中。哪个想知道阻塞等待以提供几个托管线程保证。就像在 UI 线程上发送消息循环以保持 COM 快乐 (MsgWaitForMultipleObjects),知道何时可以为下一个请求暂停远程处理请求,以及知道线程何时处于安全状态以处理中止请求。
【讨论】:
以上是关于WaitHandle.WaitAny 匹配 WaitForMultipleObjects 功能的主要内容,如果未能解决你的问题,请参考以下文章