事件驱动异步模式的替代方案有哪些?

5

我正在考虑实现一个可以同时运行多个操作的API。微软推荐使用基于事件的异步模式:

// Asynchronous methods.
public void Method1Async(string param, object userState);
public event Method1CompletedEventHandler Method1Completed;

public void CancelAsync(object userState);
public bool IsBusy { get; }

然而,这种方法似乎有些笨拙 - 它要求客户端筛选出不适用于他们的回复,并在完成后断开事件处理程序等。我的想法是更像这样:

AsyncOperation1(string parm, Action<T> callback)

每个客户端都会直接收到自己的结果。我在考虑如何优雅地支持取消操作。我猜测显而易见的做法是让AsyncOperation1返回一些可以传递到CancelAsync方法中的令牌。我想了解更多在.Net或其他语言中常用的异步模式,以便进行适当的转换。
1个回答

4

看一看Reactive Extensions,您可以返回一个Observable,客户端可以订阅它。

订阅将返回一个实现IDisposable的对象,这是取消订阅的机制,只需处理该对象即可。

例如:

IObservable<T> o = Method1Async(params);

var observer = o.Subscribe(r => {/*do stuff with the result*/},
                           ex => {/* do stuff with the exception */);

// decide to cancel
observer.Dispose();

您可以使用nuget安装响应式扩展组件,只需执行 "install-package rx-main" 命令即可。

不,你可以使用 Rx 来实现自己的异步操作,并提供 IObservable<T> 的实现给客户端订阅。请查看 http://msdn.microsoft.com/en-us/library/hh211669(v=VS.103).aspx 获取有关 ISubject<T> 接口的信息。 - Matt
然而,有许多现有的生成事件的方法可用于在实现接口之上构建可观察对象。 - Matt
谢谢 - 我会看一下。你知道并行框架是否也值得研究吗? - Shane
我尝试使用Rx玩了一下,它有一些不错的特性,但我不确定它是否很适合我的用例。 Rx似乎是围绕异步数据流设计的,但我只需要简单的操作,可能返回单个有效载荷。此外,IObservable接口仅支持具有通用名称的单个操作,因此您需要针对每个操作拥有一个对象。 - Shane
它基于事件,但不一定是关于它们的流,它被有效地用于响应单个触发事件,例如Observable.FromEventPattern。我不确定你所说的IObservable<T>带有通用名称的单个操作是什么意思...它更多地涉及一个对象,您的客户端可以订阅该对象,在异步操作完成后执行他们想要执行的操作结果,以及在抛出异常时该怎么做。 - Matt
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接