4
我選擇從我的對象方法中返回Task<T>
和Task
以便通過gui提供簡單的消息。有些方法只是等待其他類型的等待處理的互斥體。有沒有辦法從WaitHandle.Wait()
構造Task
,以便我不必爲此阻塞一個treadpool線程。WaitHandle.Wait構造任務
我選擇從我的對象方法中返回Task<T>
和Task
以便通過gui提供簡單的消息。有些方法只是等待其他類型的等待處理的互斥體。有沒有辦法從WaitHandle.Wait()
構造Task
,以便我不必爲此阻塞一個treadpool線程。WaitHandle.Wait構造任務
有一種方法可以做到這一點:你可以使用ThreadPool.RegisterWaitForSingleObject方法訂閱的WaitHandle,並通過TaskCompletionSource類包起來:
public static class WaitHandleEx
{
public static Task ToTask(this WaitHandle waitHandle)
{
var tcs = new TaskCompletionSource<object>();
// Registering callback to wait till WaitHandle changes its state
ThreadPool.RegisterWaitForSingleObject(
waitObject: waitHandle,
callBack:(o, timeout) => { tcs.SetResult(null); },
state: null,
timeout: TimeSpan.MaxValue,
executeOnlyOnce: true);
return tcs.Task;
}
}
用法:
WaitHandle wh = new AutoResetEvent(true);
var task = wh.ToTask();
task.Wait();
不錯,我只是等待,如果一些其他的彈出窗口彈出,但是這個接縫足夠好,因爲文檔說RegisterWaitForSingleObject只會阻塞64個句柄的一個線程。 – user629926
在MSDN [從等待句柄到異步](https://msdn.microsoft.com/en-us/library/hh873178%28v=vs.110%29.aspx#WHToTap)它有一個稍微好一點的版本繼續註銷註冊的等待 – gordy