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

  • 相关阅读:
    XP系统开机慢和减少开机滚动条的解决方法
    细说A标签的样式
    【部分转载】安装MySQL,visual studio tools for office 2010 runtime通不过
    将GB2312转码成UTF8
    ubuntu/vmware 拷贝后网路不通
    bash manual
    跟我一起写 Makefile
    我的vi 启动配置文件
    ubuntu安装samba
    upnp
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15109252.html
Copyright © 2011-2022 走看看