天天看點

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

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)

          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();

        }

        );

  }  

public TaskAwaiter(Func<Task> function)

  Task.Run(

      async () => {

      await function().ConfigureAwait(false);

      waiter.Set();

      }

    );

public void Await()

  waiter.WaitOne();

public void 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);

public static ITaskAwaiter<TResult> GetTaskAwaiter<TResult>(Func<Task<TResult>> function)

public static ITaskAwaiter GetTaskAwaiter(Action function)

c