的。如果我有多個異步調用方是等待數據的更新,我什麼時候應該在這個片段中更喜歡一種方法對另一:活動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將是許多用戶一個簡單的答案,但我嘗試建模拉基於異步數據流)
您可以使用TaskCompletionSource從等待結果中返回數據作爲有效內容。 –
@YuvalItzchakov是的,但只有一個事件將允許捕捉數據。在這種情況下是否有任何理由使用RWFSO? –
我看不出很大的區別。一個是基於事件的,一個是基於回調的(這幾乎是相同的)。無論你覺得合適。 –