2012-12-06 36 views
4

我選擇從我的對象方法中返回Task<T>Task以便通過gui提供簡單的消息。有些方法只是等待其他類型的等待處理的互斥體。有沒有辦法從WaitHandle.Wait()構造Task,以便我不必爲此阻塞一個treadpool線程。WaitHandle.Wait構造任務

回答

11

有一種方法可以做到這一點:你可以使用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(); 
+0

不錯,我只是等待,如果一些其他的彈出窗口彈出,但是這個接縫足夠好,因爲文檔說RegisterWaitForSingleObject只會阻塞64個句柄的一個線程。 – user629926

+3

在MSDN [從等待句柄到異步](https://msdn.microsoft.com/en-us/library/hh873178%28v=vs.110%29.aspx#WHToTap)它有一個稍微好一點的版本繼續註銷註冊的等待 – gordy