什么是基于事件的异步模式的替代品?

Sha*_*ane 5 .net asynchronous

我正在寻找实现一个API,其中多个操作可以并发运行.MS建议使用基于事件的异步模式:

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

public void CancelAsync(object userState);
public bool IsBusy { get; }
Run Code Online (Sandbox Code Playgroud)

然而,这似乎有点笨拙 - 它要求客户过滤掉不适合他们的回复并在完成后断开事件处理程序等.我的想法更像是:

AsyncOperation1(string parm, Action<T> callback)
Run Code Online (Sandbox Code Playgroud)

每个客户都可以直接获得自己的结果.我无法弄清楚如何优雅地支持取消.我想显而易见的是AsyncOperation1返回某种可以传递给CancelAsync方法的令牌.我想了解更多关于.Net或其他可以正确翻译的语言中常见的其他异步模式的用法

Mat*_*att 4

看一下Reactive Extensions,你可以返回一个可以被客户端订阅的 Observable 。

订阅返回一个实现 IDisposable 的对象,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();
Run Code Online (Sandbox Code Playgroud)

您可以使用 nuget 安装反应式扩展位,只需“install-package rx-main”