异步方法调用非异步方法最佳做法



出于某种原因,我需要继承一个类来实现异步方法,该方法是以下实现,这是最佳实践

1.

protected override Task<TResult> OnExecuteAsync<TResult><TResult>()
{
return Task.Run<TResult>(() => DoSomething());
}
protected override async Task<TResult> OnExecuteAsync<TResult><TResult>()
{
return await Task.Run<TResult>(() => DoSomething());
}

我想知道哪一个是最好的实现?

谢谢

简而言之,如果基接口需要Task结果,并且您有同步方法并且它不需要在任务中运行,则您需要做的就是为其提供一个预先完成的任务

最简单的做法是保留async关键字,返回结果,然后忽略(或pragma(警告。您不需要通过Task.Run启动任务(这将是一种无功的低效方式(。在这种情况下,编译器会自动为您处理所有事情(尽管警告您没有什么可等待的(

protected override async Task<TResult> OnExecuteAsync<TResult>()
{
return DoSomething();
}

您还可以使用Task.FromResult创建预完成的任务。唯一需要注意的是,如果消费者正在调用await,在这种情况下,您应该很好,并确保在生成的带有Task.FromExceptionTask上返回任何异常。这类似于编译器IAsyncStateMachine实现(异步和等待模式(生成的操作。

protected override Task<TResult> OnExecuteAsync<TResult>()
{
try
{
return Task.FromResult(DoSomething());
}
catch(exception ex)
{ 
// place any exception on the returned task
return Task.FromException<TResult>(ex);
}
}

相关内容

  • 没有找到相关文章