[英]Async Method Call Non-Async Method Best Practices
出于某种原因,我需要继承一个 class 来实现一个异步方法,这是下面的实现,它是最佳实践
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());
}
我想知道哪一个是最好的实现?
谢谢
简而言之,如果基础class或接口期待Task
结果,并且您有同步方法并且不需要在任务中运行,您只需给它一个预先完成的任务。
最简单的做法就是留下async
关键字,返回结果,然后忽略(或pragma
out)警告。 您不需要通过Task.Run
启动新任务(这将是一种无所作为的低效方式)。 在这种情况下,编译器会自动为您处理所有事情(尽管警告您没有什么可等待的)
protected override async Task<TResult> OnExecuteAsync<TResult>()
{
return DoSomething();
}
您还可以使用Task.FromResult
创建预先完成的任务。 唯一需要注意的是,如果消费者正在调用await
,在这种情况下,您应该很好,并确保使用Task.FromException
在生成的Task
上返回任何异常。 这类似于编译器生成的IAsyncStateMachine
实现( async 和 await 模式)会自动执行的操作。
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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.