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

  • 相关阅读:
    算法-排序之快速排序
    springMvc Velocity tool 源码分析
    无线端安全登录与鉴权二
    无线端安全登录与鉴权一之Kerberos
    Android ListView OnItemLongClick和OnItemClick事件内部细节分享以及几个比较特别的属性
    dialog横竖屏切换时消失的解决方法
    你还在问android横竖屏切换的生命周期?
    动态添加控件时,计算控件大小的解决方法
    想要生成一组三维的颜色渐变数据?
    一个PHPer如何深入学习ES搜索引擎?
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15109252.html
Copyright © 2011-2022 走看看