В rx вы можете написать:
var oe = Observable.FromEventPattern<SqlNotificationEventArgs>(sqlDep, "OnChange");
и затем подписаться на наблюдаемое, чтобы преобразовать событие OnChange объекта sqlDep в наблюдаемое.
Аналогично, как вы можете создатьЗадача из события C # с использованием библиотеки параллельных задач?
РЕДАКТИРОВАТЬ: уточнение Решение, указанное Дрю и затем явно написанное пользователем 3775487, работает для одного события.Как только задача завершена ... хорошо, она закончена.
Наблюдаемое событие может инициироваться снова в любое время.Это можно рассматривать как наблюдаемый поток.Этакий ISourceBlock в потоке данных TPL.Но в документе http://msdn.microsoft.com/en-us/library/hh228603(v=vs.110).aspx нет примера ISourceBlock.
В конце концов я нашел сообщение на форуме, объясняющее, как это сделать: http://social.msdn.microsoft.com/Forums/en/tpldataflow/thread/a10c4cb6-868e-41c5-b8cf-d122b514db0e
public static ISourceBlock CreateSourceBlock (Action, Action, Action, ISourceBlock> executor) {var bb = newBufferBlock ();executor (t => bb.Post (t), () => bb.Complete (), e => bb.Fault (e), bb);возврат бб;}
//Remark the async delegate which defers the subscription to the hot source.
var sourceBlock = CreateSourceBlock<SomeArgs>(async (post, complete, fault, bb) =>
{
var eventHandlerToSource = (s,args) => post(args);
publisher.OnEvent += eventHandlerToSource;
bb.Complete.ContinueWith(_ => publisher.OnEvent -= eventHandlerToSource);
});
Я не пробовал приведенный выше код.Может быть несоответствие между асинхронным делегатом и определением CreateSourceBlock.