c# – 到Task.Run或不到Task.Run

c# – 到Task.Run或不到Task.Run,第1张

概述假设我有一个包含异步方法的接口,我有两个不同的接口实现.两种实现中的一种是自然异步,而另一种则不是.实现非异步方法的“最正确”方法是什么? public interface ISomething { Task<Foo> DoSomethingAsync();}// Normal async implementationpublic class Implementation1 : I 假设我有一个包含异步方法的接口,我有两个不同的接口实现.两种实现中的一种是自然异步,而另一种则不是.实现非异步方法的“最正确”方法是什么?
public interface ISomething {    Task<Foo> DoSomethingAsync();}// normal async implementationpublic class Implementation1 : ISomething {    async Task<Foo> ISomething.DoSomethingAsync() {        return await DoSomethingElseAsync();    }}// Non-async implementationpublic class Implementation2 : ISomething {    // Should it be:    async Task<Foo> ISomething.DoSomethingAsync() {        return await Task.Run(() => DoSomethingElse());    }    // Or:    async Task<Foo> ISomething.DoSomethingAsync() {        return DoSomethingElse();    }}

我试着跟上Stephen Cleary的blog,我知道其中任何一个都没有提供任何异步的好处,而且我对此很满意.第二个对我来说似乎更正确,因为它不会假装不是它的东西,但它确实给出了编译器警告,并且那些加起来并且分散注意力.

如果这会产生影响,那么这些都将在ASP.NET(Web MVC和WebAPI)中.

解决方法 您可以完全放弃async修饰符并使用Task.Fromresult同步返回已完成的任务:
Task<Foo> ISomething.DoSomethingAsync(){    return Task.Fromresult(DoSomethingElse());}

这会处理警告并具有更好的性能,因为它不需要异步方法的状态机开销.

但是,这有点change the semantics of exception handling.如果这是一个问题,那么您应该使用同步异步方法方法并接受警告(或通过注释将其关闭):

#pragma warning disable 1998    async Task<Foo> ISomething.DoSomethingAsync() #pragma warning restore 1998    {        return DoSomethingElse();    }

正如Stephen Cleary建议您也可以通过等待已完成的任务来处理该警告(同时保持方法同步):

async Task<Foo> ISomething.DoSomethingAsync() {    await Task.Fromresult(false); // or Task.CompletedTask in .Net 4.6    return DoSomethingElse();}
总结

以上是内存溢出为你收集整理的c# – 到Task.Run或不到Task.Run全部内容,希望文章能够帮你解决c# – 到Task.Run或不到Task.Run所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1248516.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存