Task.FromResult
如果从异步接口或基类继承代码,但希望用同步的方法来实现它,就会出现这样一个问题,如何实现一个具有异步签名的同步方法?
可以使用 Task.FromResult 方法创建并返回一个新的 Task<T>
对象,这个 Task 对象是已经成功完成的,并有指定的结果。
public static Task<TResult> FromResult<TResult>(TResult result);
- 如下所示:
interface IMyAsyncInterface
{
Task<int> GetValueAsync();
}
class MySynchronousImplementation : IMyAsyncInterface
{
public Task<int> GetValueAsync()
{
return Task.FromResult(13);
}
}
- 在用同步代码实现异步接口时,要避免使用任何形式的阻塞操作。在异步方法中进行阻塞操作,然后返回一个完成的 Task 对象,这种做法并不可取。
TaskCompletionSource
Task.FromResult 只能提供结果正确的同步 Task 对象。如果要让返回的 Task 对象有一个其他类型的结果(例如以 NotImplementedException 结束的 Task 对象),
需要使用TaskCompletionSource :
static Task<T> NotImplementedAsync<T>()
{
var tcs = new TaskCompletionSource<T>();
tcs.SetException(new NotImplementedException());
return tcs.Task;
}