Task.FromResult

如果从异步接口或基类继承代码,但希望用同步的方法来实现它,就会出现这样一个问题,如何实现一个具有异步签名的同步方法?

可以使用 Task.FromResult 方法创建并返回一个新的 Task<T> 对象,这个 Task 对象是已经成功完成的,并有指定的结果。

  1. public static Task<TResult> FromResult<TResult>(TResult result);
  • 如下所示:
  1. interface IMyAsyncInterface
  2. {
  3. Task<int> GetValueAsync();
  4. }
  5. class MySynchronousImplementation : IMyAsyncInterface
  6. {
  7. public Task<int> GetValueAsync()
  8. {
  9. return Task.FromResult(13);
  10. }
  11. }
  • 在用同步代码实现异步接口时,要避免使用任何形式的阻塞操作。在异步方法中进行阻塞操作,然后返回一个完成的 Task 对象,这种做法并不可取。

TaskCompletionSource

  • Task.FromResult 只能提供结果正确的同步 Task 对象。如果要让返回的 Task 对象有一个其他类型的结果(例如以 NotImplementedException 结束的 Task 对象),

  • 需要使用TaskCompletionSource :

  1. static Task<T> NotImplementedAsync<T>()
  2. {
  3. var tcs = new TaskCompletionSource<T>();
  4. tcs.SetException(new NotImplementedException());
  5. return tcs.Task;
  6. }