C# 不是异步的方法中获取异步的结果
阅读原文时间:2023年07月10日阅读:1

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

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

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

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

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

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章