返工EventWaitHandle以异步等待信号

当调用EventWaitHandle.WaitOne时,我需要将当前代码更改为不阻止当前线程。 问题是我正在等待全系统事件。 我还没有找到任何适当的替代品。

码:

EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.AutoReset, "Local event", out screenLoadedSignalMutexWasCreated); StartOtherApp(); if (screenLoadedSignalMutexWasCreated) { isOtherAppFullyLoaded = handle.WaitOne(45000, true); if (isOtherAppFullyLoaded ) { // do stuff } else { // do stuff } handle.Dispose(); signalingCompleted = true; } else { isOtherAppFullyLoaded = false; throw new Exception(" "); } 

我需要应用程序继续而不是停在我称之为WaitOne的行上,理想情况下会有等待。 我该如何实现呢?

您可以在我的AsyncEx库中使用AsyncFactory.FromWaitHandle

 isOtherAppFullyLoaded = await AsyncFactory.FromWaitHandle(handle, TimeSpan.FromMilliseconds(45000)); 

该实现使用ThreadPool.RegisterWaitForSingleObject

 public static Task FromWaitHandle(WaitHandle handle, TimeSpan timeout) { // Handle synchronous cases. var alreadySignalled = handle.WaitOne(0); if (alreadySignalled) return Task.FromResult(true); if (timeout == TimeSpan.Zero) return Task.FromResult(false); // Register all asynchronous cases. var tcs = new TaskCompletionSource(); var threadPoolRegistration = ThreadPool.RegisterWaitForSingleObject(handle, (state, timedOut) => ((TaskCompletionSource)state).TrySetResult(!timedOut), tcs, timeout); tcs.Task.ContinueWith(_ => { threadPoolRegistration.Dispose(); }, TaskScheduler.Default); return tcs.Task; }