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()
高效地使用单个线程等待任何句柄完成。