• 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;
    }
    }

  • 相关阅读:
    块元素&行内元素
    semantic ui要装什么才能使用
    float属性
    CSS 选择器
    px,em和rem
    CSS各类布局
    一个 / 引起想骂他事件
    使用fastjson 获取json字符串中的数组,再转化为java集合对象
    计算面试题
    Dubbo(二) 一次惨痛的流血事故
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15109252.html
Copyright © 2020-2023  润新知