出于某种原因,我需要继承一个类来实现异步方法,该方法是以下实现,这是最佳实践
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.FromException
的Task
上返回任何异常。这类似于编译器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);
}
}