C# 如何等待句柄/安全句柄?

C# 如何等待句柄/安全句柄?,c#,task,pinvoke,C#,Task,Pinvoke,我有一个从p/Invoke'dapi获得的进程HANDLE。什么是能很好地处理任务的WaitForSingleObject或WaitOne的道德等价物?我会用WaitHandle来概括它,如下所示: private class MyWaitHandle : System.Threading.WaitHandle { public MyWaitHandle(IntPtr handle) { this.SafeWaitHandle = new Micr

我有一个从
p/Invoke
'dapi获得的进程
HANDLE
。什么是能很好地处理任务的
WaitForSingleObject
WaitOne
的道德等价物?

我会用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();
}

不确定在处理任务时需要什么样的细节,但如果您希望任务在等待事件完成时完成,则启动一个只等待WaitOne()返回的
任务
,然后您可以像其他任何任务一样等待该
任务。

我会用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();
}

不确定在处理任务时需要什么样的细节,但如果您希望任务在等待事件完成时完成,则启动一个只等待WaitOne()返回的
任务
,然后您可以像其他任务一样等待该任务。

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

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


使任务友好有点棘手。从Stephen Cleary的AsyncEx库中使用,或者查看实现以了解如何运行自己的程序。

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

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


使任务友好有点棘手。使用Stephen Cleary的AsyncEx库或查看实现,以了解如何滚动您自己的。

RegisterWaitForSingleObject。不要隐藏有关句柄类型和api的详细信息,这是没有意义的。@HansPassant这可能是CreateProcess.RegisterWaitForSingleObject中的进程句柄。不要隐藏句柄类型和api的详细信息,这样做没有意义。@HansPassant这是CreateProcess中的一个进程句柄。Stephen Cleary的AsyncEx库中有。但它仍然处于阻塞状态,因此它的功能与现有的WaitForSingleObject调用相同:(.如果可能的话,我不想使用任务线程。windows等待句柄通过阻塞线程直到发出完成信号来在后端工作。如果您正在等待线程,那么您就是在某处阻塞线程。您可以使用专用线程、线程池中的工作线程等,但在等待时会在某处使用线程。我认为不使用线程的唯一方法是使用
计时器定期回调工作线程,轮询等待句柄以等待完成,然后用它来表示任务完成——但这不是很有效…@Tim:该死,这很不幸。我想如果我想更聪明一些,我需要合并进程以某种方式等待。如果您正在等待大量句柄,请使用
WaitHandle.WaitAny()
有效地等待任何句柄使用单个线程完成。Stephen Cleary的AsyncEx库中有一个线程。尽管如此,它仍然处于阻塞状态,因此在功能上与现有的WaitForSingleObject调用相同:(.如果可能的话,我不想使用任务线程。windows等待句柄通过阻塞线程直到发出完成信号来在后端工作。如果您正在等待线程,那么您就是在某处阻塞线程。您可以使用专用线程、线程池中的工作线程等,但在等待时会在某处使用线程。我认为不使用线程的唯一方法是使用
计时器定期回调工作线程,轮询等待句柄以等待完成,然后用它来表示任务完成——但这不是很有效…@Tim:该死,这很不幸。我想如果我想更聪明一些,我需要合并进程以某种方式等待。如果正在等待大量句柄,请使用
WaitHandle.WaitAny()
高效地使用单个线程等待任何句柄完成。