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() 与设置为 TRUEWaitAll 匹配。

【讨论】:

【参考方案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 功能的主要内容,如果未能解决你的问题,请参考以下文章

Warp/WAI 的线程安全状态

WAI-ARIA:Javascript 能力测试?

什么是导航栏/菜单的 WAI-ARIA 兼容实现

如何为 WAI-ARIA 标记加载动画?

html WAI-ARIA角色(地标角色,小部件角色等)

WAI-ARIA无障碍网页资料