I want to WaitForMultipleObjects on 2 different types:
I don't know how to convert (in the appropriate way) "process.Handle" to a WaitHandle in order to have the following code working:
var waitHandles = new WaitHandle[2];
waitHandles[0] = waitHandleExit;
// Next line is the offending one:
waitHandles[1] = new SafeWaitHandle(process.Handle, false);
int waitResult = WaitHandle.WaitAny(waitHandles, timeOut);
Im getting the error:
Error 1 Cannot implicitly convert type 'Microsoft.Win32.SafeHandles.SafeWaitHandle' to 'System.Threading.WaitHandle' ...
Anybody know the right way to wait for a process and an EventWaitHandle ?
Update... Reasons for my choice of answer.
First of all thanks to all: Jaroen, Slugart and Sriram. All answers were very nice.
Thanks a lots!!!
You could subclass the WaitHandle which represents Process.Handle
and use instance of that WaitHandle
to wait.
public class ProcessWaitHandle : WaitHandle
{
private readonly Process process;
public ProcessWaitHandle(Process process)
{
this.process = process;
this.SafeWaitHandle = new SafeWaitHandle(process.Handle, false);
}
}
var waitHandles = new WaitHandle[2]
{
waitHandleExit,
new ProcessWaitHandle(process)
};
int waitResult = WaitHandle.WaitAny(waitHandles, timeOut);
You could create your own EventWaitHandle and set it on the Process.Exited event:
var waitHandle = new ManualResetEvent(false);
process.Exited += (sender, e) => waitHandle.Set()
waitHandles[1] = waitHandle;
A process handle is not naturally awaitable nor does it sit in the same inheritance tree as WaitHandle. You need to wrap it in an event (which does extend WaitHandle), e.g.:
ManualResetEvent resetEvent = new ManualResetEvent(true);
resetEvent.SafeWaitHandle = new SafeWaitHandle(new IntPtr(process.Handle.ToPointer()), false);
waitHandles[1] = = resetEvent;
All WaitHandle implementations will use a SafeWaitHandle: "The SafeWaitHandle class is used by the System.Threading.WaitHandle class. It is a wrapper for Win32 mutexes and auto and manual reset events."
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With