我正在考虑实现一个可以同时运行多个操作的API。 MS建议使用基于事件的异步模式:
// 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或其他可以正确翻译的语言中常见的其他异步模式的信息
答案 0 :(得分: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安装Reactive Extensions位,只需“install-package rx-main”