繁体   English   中英

异步方法调用非异步方法最佳实践

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM