我有一个程序HANDLE,我是从P/Invoke的d中得到的,它在道义上相当于WaitForSingleObject或WaitOne,它很好地处理任务。
发布于 2017-08-31 23:39:39
我会将它封装在一个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。
发布于 2021-03-20 22:21:12
从性能的角度来看,ThreadPool.RegisterWaitForSingleObject是您希望在这种情况下使用的。ThreadPool将使用单个线程对以这种方式注册的所有对象进行等待。
要将该API与流程句柄一起使用,您需要将其包装到WaitHandle中,如Tim中所示。
让它成为任务友好是有点棘手。使用Stephen的WaitHandleAsycFactory.FromWaitHandle库,或者查看实现,找出如何滚动自己的实现。
https://stackoverflow.com/questions/45991276
复制相似问题