C# 在C中复制MsgWaitForMultipleObjectsEx# < >我需要在C++中复制以下C++函数:

C# 在C中复制MsgWaitForMultipleObjectsEx# < >我需要在C++中复制以下C++函数:,c#,c++,.net,wpf,C#,C++,.net,Wpf,我相信这个函数的关键是找到一个C#等价于。到目前为止,我在C#中发现的最接近这种行为的方法是方法。使用WaitAny()我可以设置计时器,还可以指定当前实例将等待的WaitHandle对象。但是,我的问题在于dwWakeMask和dwFlags值,因为我似乎无法将它们与System.Threading中的任何对象匹配。我还关心WAIT\u IO\u COMPLETION和WAIT\u OBJECT\u 0 这是到目前为止我的C#代码: private void CommWaitForAndHan

我相信这个函数的关键是找到一个C#等价于。到目前为止,我在C#中发现的最接近这种行为的方法是方法。使用
WaitAny()
我可以设置计时器,还可以指定当前实例将等待的
WaitHandle
对象。但是,我的问题在于dwWakeMask和dwFlags值,因为我似乎无法将它们与
System.Threading
中的任何对象匹配。我还关心
WAIT\u IO\u COMPLETION
WAIT\u OBJECT\u 0

这是到目前为止我的C#代码:

private void CommWaitForAndHandleMessages(int minimum_poll)
{
    Thread.WaitHandle[] waitHandles = new Thread.WaitHandle[]
    {
        //This is where I would create my WaitHandle array
    };

    int ret = Thread.WaitHandle.WaitAny(/* BLANK **/, new TimeSpan(minimum_poll), false);

    //Timeout -- return 
    if(ret == Thread.WaitHandle.WaitTimeout)
        return;
}
我读到过,它“获取或设置本机操作系统句柄”。我是否能够使用
SafeWaitHandle
来访问本机值,如
QS_ALLINPUT
?如果不是,我如何添加到我的方法来复制C++函数的行为? 注意:我必须在没有p/Invoke或任何包装器的情况下执行此操作。

在“pure.NET”中没有完全相同的功能。但是由于您没有使用p/invoke,因此您没有真正的Win32 APC,因此不需要完全相同的效果。(特别是,您不需要可警报的等待)

为此,请通过WPF
SynchronizationContext
转发I/O回调,该上下文将通过现有的WPF消息循环传递它们

类似地,如果要转换实际传递句柄数组的用法,您可能希望使用任务而不是
WaitHandle
,则
任务的继续部分也使用WPF SynchronizationContext。但你的C++代码没有使用MWFMO的句柄等待能力。
最后,超时可以使用
wait Task.Delay(timeout)
,它使用一个延续,如上所述

对于TCP/IP通信,它可能看起来像这样(基于 ):


这正是我要说的!所以我可以在
SynchronizationContext
Task
中找到我所需要的一切?你知道我在哪里能找到这样的例子吗?或者您是否可以提供一个小的方法?@Ericafterdark:
Dispatcher.BeginInvoke
是关键方法,在不知道您实际想做什么的情况下,我无法给出一个示例。您是在处理网络事件,还是在工作线程上完成计算,还是什么?我认为这更多的是在网络事件领域。基本上,我的程序通过TCP/IP套接字连接到外部机器。在代码的这部分中,我的程序正在等待来自机器的消息,并处理上面触发的C++代码中的每一个条件。我已经从C++程序中添加了一些注释,这些代码可能会有帮助。@埃里克:一些例子添加了,未经测试。
private void CommWaitForAndHandleMessages(int minimum_poll)
{
    Thread.WaitHandle[] waitHandles = new Thread.WaitHandle[]
    {
        //This is where I would create my WaitHandle array
    };

    int ret = Thread.WaitHandle.WaitAny(/* BLANK **/, new TimeSpan(minimum_poll), false);

    //Timeout -- return 
    if(ret == Thread.WaitHandle.WaitTimeout)
        return;
}
var cts = new CancellationTokenSource();

var recvTask = tcpSocket.ReadAsync(buffer, offset, length, cts.Token);

if (!await recvTask.Wait(3000, cts.Token)) {
    cts.Cancel();
    uiStatus("MessageTimeout");
    return;
}

int bytesReceived = recvTask.Result;
// buffer has been filled in, go ahead and process the message