zoukankan      html  css  js  c++  java
  • C# 不是异步的方法中获取异步的结果

    var waiter = HP.UtilsLib.TaskAwaiterHelper.GetTaskAwaiter(
    async () =>
    {
      return await feedBack(version, Email, EmailContent).ConfigureAwait(false);
    }
    );
    var result = waiter.GetResult();
    waiter.Dispose();

    --------------------------------------------------------------------------------------------------

    public interface ITaskAwaiter<TResult>: IDisposable
    {
      TResult GetResult();
      void Await();
    }
    public interface ITaskAwaiter: IDisposable
    {
      void Await();
    }
    public static class TaskAwaiterHelper
    {
      private class TaskAwaiter<TResult> : ITaskAwaiter<TResult>
      {
        private ManualResetEvent waiter = new ManualResetEvent(false);
        public TaskAwaiter(Func<TResult> function)
        {
          Task.Run(
              () => {
              result=function();
              waiter.Set();
              }
              );
        }
        public TaskAwaiter(Func<Task<TResult>> function)
        {
          Task.Run(
              async () =>
              {
                result = await function().ConfigureAwait(false);
                waiter.Set();
              }
              );
        }
      private TResult result;
      public void Await()
      {
        waiter.WaitOne();
      }

      public TResult GetResult()
      {
        Await();
        return result;
      }

      public void Dispose()
      {
        waiter.Dispose();
      }
    }

    private class TaskAwaiter : ITaskAwaiter
    {
      private ManualResetEvent waiter = new ManualResetEvent(false);
      public TaskAwaiter(Action action)
      {
        Task.Run(
          () => {
              action();
              waiter.Set();
            }
            );
      }  
    public TaskAwaiter(Func<Task> function)
    {
      Task.Run(
          async () => {
          await function().ConfigureAwait(false);
          waiter.Set();
          }
        );
    }
    public void Await()
    {
      waiter.WaitOne();
    }

    public void Dispose()
    {
    waiter.Dispose();
    }
    }

    public static ITaskAwaiter<TResult> GetTaskAwaiter<TResult>(Func<TResult> function)
    {
    TaskAwaiter<TResult> taskAwaiter = new TaskAwaiter<TResult>(function);
    return taskAwaiter;
    }
    public static ITaskAwaiter GetTaskAwaiter(Func<Task> function)
    {
    TaskAwaiter taskAwaiter = new TaskAwaiter(function);
    return taskAwaiter;
    }
    public static ITaskAwaiter<TResult> GetTaskAwaiter<TResult>(Func<Task<TResult>> function)
    {
    TaskAwaiter<TResult> taskAwaiter = new TaskAwaiter<TResult>(function);
    return taskAwaiter;
    }
    public static ITaskAwaiter GetTaskAwaiter(Action function)
    {
    TaskAwaiter taskAwaiter = new TaskAwaiter(function);
    return taskAwaiter;
    }
    }

  • 相关阅读:
    我的云之旅hadoop集群(3)
    动态域名绑定
    我的云之旅hadoop集群集成Hive(4)
    Axis2实践
    PHP Apache Mysql搭建
    JavaEE程序员必读图书大推
    我的云之旅hadoop集群集成Hbase集群(5)
    本博客总排名进入前100
    关系数据库及NoSql图书大推荐
    Last_IO_Errno: 1032
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15109252.html
Copyright © 2011-2022 走看看