2015-05-19 18 views
2

的。如果我有多個異步調用方是等待數據的更新,我什麼時候應該在這個片段中更喜歡一種方法對另一:活動VS RegisterWaitForSingleObject多個異步消費者數據

public delegate void NewDataHandler(int data); 

public class DataSource { 
    public event NewDataHandler OnNewData; 
    public AutoResetEvent are = new AutoResetEvent(false); 


    public void AddData(int i) { 
     OnNewDataInvoke(i); 
    } 

    private void OnNewDataInvoke(int data) { 
     OnNewData?.Invoke(data); 
     are.Set(); 
    } 

    public Task WaitEventAsync() { 
     var tcs = new TaskCompletionSource<bool>(); 
     var subscribtion = (NewDataHandler)null; 
     subscribtion = (i) => { 
      tcs.TrySetResult(true); // note that i ignored here, but could send actual data 
      OnNewData -= subscribtion; 
     }; 
     OnNewData += subscribtion; 
     return tcs.Task; 
    } 

    public Task WaitAREAsync() { 
     var tcs = new TaskCompletionSource<bool>(); 
     var rwh = ThreadPool.RegisterWaitForSingleObject(are, 
      delegate { tcs.TrySetResult(true); }, null, -1, true); 
     var t = tcs.Task; 
     t.ContinueWith(_ => rwh.Unregister(null)); 
     return t; 
    } 
} 

活動較爲常見,允許捕獲數據有效載荷,不僅是數據更新的信號。 RWFSO有什麼好處?

器(Rx將是許多用戶一個簡單的答案,但我嘗試建模基於異步數據流)

+1

您可以使用TaskCompletionSource 從等待結果中返回數據作爲有效內容。 –

+0

@YuvalItzchakov是的,但只有一個事件將允許捕捉數據。在這種情況下是否有任何理由使用RWFSO? –

+0

我看不出很大的區別。一個是基於事件的,一個是基於回調的(這幾乎是相同的)。無論你覺得合適。 –

回答

1

RegisterWaitForSingleObject與事件組合是更加昂貴,並且難以使用。我現在無法想象使用它的任何理由。

TaskCompletionSource可以加倍作爲一個很好的模式事件。顯然,這個「事件」只能設置一次。 TaskCompletionSource與其他TPL(await和任務組合器)配合良好。

+0

最後,只有一個事件或RWFSO + ARE將保留,都使用TCS。問題是要保留哪一個以及要刪除哪一個:WaitEventAsync或WaitAREAsync,它們不以任何組合使用。這裏只是一個例子,如何使用兩者。 –

+0

保持WaitEventAsync。我認爲我已經明確表示WaitAREAsync沒有優勢。顯然不是。 – usr

+0

那麼我們可以說RWFSO僅在事件模式不可行時纔有用,例如,非託管等待手柄? –

相關問題