Если у меня есть несколько асинхронных абоненты, которые ожидают обновление данных, когда я должен предпочесть один метод над другим в этом фрагменте:Событие против 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 yep, но только событие позволит захватить данные. Есть ли причина использовать RWFSO в этом контексте? –
Я не вижу большой разницы. Один из них основан на событиях, один из которых основан на обратном вызове (которые почти одинаковы). Какой бы вы ни находили подходящим. –