2017-08-31 59 views
-1

我有一个流程HANDLE我从P/Invoke的d API获得。与任务搭配很好的WaitForSingleObjectWaitOne的道德等值是什么?我该如何等待HANDLE/SafeHandle?

+0

RegisterWaitForSingleObject也许。通过不隐藏关于句柄和api类型的细节来获得更好的答案,这是毫无意义的。 –

+0

@HansPassant这是来自CreateProcess的进程句柄。 –

回答

2

我会包起来的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就好 任何其他。

+0

Stephen Cleary的AsyncEx库中有['WaitHandleAsyncFactory.FromWaitHandle'](https://github.com/StephenCleary/AsyncEx/blob/master/src/Nito.AsyncEx.Interop.WaitHandles/Interop/WaitHandleAsyncFactory.cs)。 –

+0

虽然这仍然阻塞,所以它在功能上与现有的WaitForSingleObject调用相同:(如果可能,我不想使用任务线程 –

+0

通过阻塞线程直到完成为止,Windows等待句柄在后端工作如果你正在等待一个线程,那么你在某个地方阻塞了一个线程,你可以使用一个专用线程,一个来自线程池的工作线程等,但是某个线程在等待的时候被占用。认为不使用线程会使用定时器来定时回调工作线程,以轮询等待句柄来完成,然后使用它来发信号完成任务 - 但这不是非常高效...... – Tim