我有一个来自HANDLE
API的流程P/Invoke
。什么是WaitForSingleObject
或WaitOne
的道德等价物,它与任务很好地结合在一起?
答案 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 或查看实现以了解如何推出自己的库。