【问题标题】:What are some of the alternatives to the Event-based Asynchronous Pattern?基于事件的异步模式有哪些替代方案?
【发布时间】:2011-12-07 13:12:57
【问题描述】:

我正在考虑实现一个可以同时运行多个操作的 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 或其他可以适当翻译的语言中常用的其他异步模式

【问题讨论】:

    标签: .net asynchronous


    【解决方案1】:

    看看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”

    【讨论】:

    • 我认为您描述了一种将现有的基于事件的异步 API 适应 IObservable 的方法。如何从头开始实施一种新的 API?
    • 不,您可以使用 Rx 来实现您自己的异步操作,并将 IObservable 的实现提供给您的客户以供他们订阅。查看msdn.microsoft.com/en-us/library/hh211669(v=VS.103).aspx 了解有关 ISubject 界面 的信息
    • 但是,有很多现有的方法可以生成事件,您可以使用这些方法在比实现接口更高的级别上构建 observables
    • 谢谢 - 会看看。你知道并行框架是否也值得研究?
    • 是的 TPL 值得一看,这个答案 (stackoverflow.com/questions/4105206/…) 详细说明了两者之间的一些差异
    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    相关资源
    最近更新 更多