简单实现C#异步操作

2019-12-26 17:28:50王旭

Asynchronous 异步操作封装
ActionAsync和FuncAsync为异步操作打下了基础,接下来最重要的工作就是通过这两个类执行我们的异步操作,为此我封装了一个异步操作类
主要封装了以下几个部分:

  • WaitAll(IEnumerable<Operator> operations):等待所有操作执行完毕
  • WaitAny(IEnumerable<Operator> operations):等待任意操作执行完毕
  • ActionAsync
  • FuncAsync
  • ContinueWithAction
  • ContinueWithFunc

    后面四个包含若干个重载,这里只是笼统的代表一个类型的方法
    WaitAll

    
    public static void WaitAll(IEnumerable<Operator> operations)
    {
    foreach (var @operator in operations)
    {
      @operator.Wait();
    }
    }
    

    WaitAny

    
    public static void WaitAny(IEnumerable<Operator> operations)
    {
    while (operations.All(o => !o.Middle.IsCompleted))
      Thread.Sleep(100);
    }
    

    等待时间可以自定义
    ActionInvoke

    
    public static Operator Invoke(Action action)
    {
    Operator operation = new ActionAsync(action);
    operation.Invoke();
    return operation;
    }
    public static Operator Invoke<T>(Action<T> action, T parameter)
    {
    Operator operation = new ActionAsync<T>(action, parameter);
    operation.Invoke();
    return operation;
    }
    public static Operator Invoke<T1, T2>(Action<T1, T2> action, T1 parameter1, T2 parameter2)
    {
    Operator operation = new ActionAsync<T1, T2>(action, parameter1, parameter2);
    operation.Invoke();
    return operation;
    }
    

    FuncInvoke

    
    public static Operator Invoke<TResult>(Func<TResult> func)
    {
    Operator operation = new FuncAsync<TResult>(func);
    operation.Invoke();
    return operation;
    }
    public static Operator Invoke<TParameter, TResult>(Func<TParameter, TResult> func, TParameter parameter)
    {
    TParameter param = parameter;
    Operator operation = new FuncAsync<TParameter, TResult>(func, param);
    operation.Invoke();
    return operation;
    }
    public static Operator Invoke<T1, T2, TResult>(Func<T1, T2, TResult> func, T1 parameter1, T2 parameter2)
    {
    Operator operation = new FuncAsync<T1, T2, TResult>(func, parameter1, parameter2);
    operation.Invoke();
    return operation;
    }