代码之家  ›  专栏  ›  技术社区  ›  David Boike

将异步编程模型(开始/结束方法)转换为基于事件的异步模型?

  •  1
  • David Boike  · 技术社区  · 14 年前

    假设我有使用异步编程模型的代码,即它提供了以下方法作为一个组,可以同步或异步使用:

    public MethodResult Operation(<method params>);
    
    public IAsyncResult BeginOperation(<method params>, AsyncCallback callback, object state);
    public MethodResult EndOperation(IAsyncResult ar);
    

    我想做的是用一个附加的层包装这段代码,这个层将把它转换成事件驱动的异步模型,如下所示:

    public void OperationAsync(<method params>);
    public event OperationCompletedEventHandler OperationCompleted;
    public delegate void OperationCompletedEventHandler(object sender, OperationCompletedEventArgs e);
    

    有没有人有任何指导(或链接到这样的指导)如何做到这一点?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Marc Gravell    14 年前

    "Async without the pain" 关于这方面的一些想法:所提供的代码使用回调方法,但是如果将其放到实例上,事件就足够简单了。

    public static void RunAsync<T>(
        Func<AsyncCallback, object, IAsyncResult> begin,
        Func<IAsyncResult, T> end,
        Action<Func<T>> callback) {
        begin(ar => {
            T result;
            try {
                result = end(ar); // ensure end called
                callback(() => result);
            } catch (Exception ex) {
                callback(() => { throw ex; });
            }
        }, null);
    }
    
        2
  •  2
  •   StanislawSwierc    13 年前

    http://asyncfunc.codeplex.com

    代码如下所示:

    public class Original
    {
        public ResultType Operation(ParamType param){...}
        public IAsyncResult BeginOperation(ParamType param, AsyncCallback callback, object state){...}
        public ResultType EndOperation(IAsyncResult ar){...}
    }
    
    public class Wrapper
    {
        private AsyncFunc<ParamType, ResultType> _operation;
        private Original _original;
    
        public Wrapper(Original original)
        {
            _original = original;
            _operation = AsyncFunc<ParamType, ResultType>(_original.Operation);
        }
    
        public ResultType Operation(ParamType param)
        {
            return _original.Operation(param);
        }
    
        public void OperationAsync(ParamType param)
        {
            _operation.InvokeAsync(param)
        }
    
        public event AsyncFuncCompletedEventHandler<ResultType> OperationCompleted      
          {
            add { _operation.Completed += value; }
            remove { _operation.Completed -= value; }
        }
    }
    

    注意在这种方法中 . 可以用AsyncFunc泛型类型替换它们:

    OperationCompletedEventArgs -> ResultType
    OperationCompletedEventHandler -> AsyncFuncCompletedEventHandler<ResultType>
    

    有关更高级的方案,请转到AsyncFunc主页。有一些视频和样本。