在 rx 你可以写:
var oe = Observable.FromEventPattern<SqlNotificationEventArgs>(sqlDep, "OnChange");
然后订阅 observable 将 sqlDep 对象上的 OnChange 事件转换为 observable。
同样,如何使用任务并行库从 C# 事件创建任务?
编辑:澄清 Drew 指出然后由 user375487 明确编写的解决方案适用于单个事件。任务一完成……嗯,它就完成了。
可观察事件可以随时再次触发。它可以看作是一个可观察的流。TPL 数据流中的一种 ISourceBlock。但是在文档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
公共静态 ISourceBlock CreateSourceBlock(Action,Action,Action,ISourceBlock> executor){ var bb = new BufferBlock(); 执行者(t => bb.Post(t), () => bb.Complete(), e => bb.Fault(e), bb); 返回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 的定义可能不匹配。