我如何等待HANDLE / SafeHandle?

时间:2017-08-31 23:07:41

标签: c# task pinvoke

我有一个来自HANDLE API的流程P/Invoke。什么是WaitForSingleObjectWaitOne的道德等价物,它与任务很好地结合在一起?

2 个答案:

答案 0 :(得分:4)

我会将它包装在WaitHandle中,如下所示:

    private class MyWaitHandle : System.Threading.WaitHandle {
        public MyWaitHandle(IntPtr handle) {
            this.SafeWaitHandle = new Microsoft.Win32.SafeHandles.SafeWaitHandle(handle, true   /*change to false if you will manually close your handle*/);
        }
    }

然后将你的p /被调用句柄传递给新的MyWaitHandle并正常等待它:

using (var myWaitThing = new MyWaitHandle(hSomeUnmanagedHandle)) {
     myWaitThing.WaitOne();
}

在玩任务时不确定你正在寻找什么样的细节,但是如果你想在等待事件完成时完成一项任务,那么启动Task除了等待WaitOne之外什么都不做()返回,然后你可以像其他任何人一样等待Task

答案 1 :(得分:0)

从性能的角度来看,ThreadPool.RegisterWaitForSingleObject 是您在这种情况下想要使用的。 ThreadPool 将使用一个线程来等待所有以这种方式注册的对象。

要将 API 与进程句柄一起使用,您需要将其包装到 WaitHandle 中,如 Tim 的回答所示。

让它对任务友好有点棘手。使用 Stephen Cleary 的 AsyncEx 库中的 WaitHandleAsycFactory.FromWaitHandle 或查看实现以了解如何推出自己的库。