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

  • 相关阅读:
    yarn 国内加速,修改镜像源
    Gradle Wrapper 介绍
    使用 Gradle 快速创建 Java 项目
    Gradle 安装
    gradle 国内加速,修改镜像源
    maven 国内加速,修改镜像源
    java如何对map进行排序详解(map集合的使用)
    Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用
    给定字符串正整数,进行排序并返回排序后字符串
    Linux学习118 nginx与php结合实现web网站及优化
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15109252.html
Copyright © 2011-2022 走看看