toTask.Run要不要运行Task.Run假设我有一个接口,里面包含一个异步方法,我有两个不同的接口实现.两种实现中的一种自然是异步的,另一种则不是。实现非异步方法的“最正确”方法是什么?公共接口ISomething{任务DoSomethingAsync();}//普通异步实现publicclassImplementation1:ISomething{asyncTaskISomething.DoSomethingAsync(){返回等待DoSomethingElseAsync();}}//非异步ISomething实现public2/应该是:asyncTaskISomething.DoSomethingAsync(){returnawaitTask.Run(()=>DoSomethingElse());}//或者:异步任务ISomething.DoSomethingAsync(){returnDoSomethingElse();我试着跟上StephenCleary的博客,我知道它们都没有提供任何异步好处,我对此很满意。第二个对我来说似乎更正确,因为它不会假装它不是,但它确实会发出编译器警告,这些警告加起来会让人分心。如果这很重要,那一切都在ASP.NET(WebMVC和WebAPI)中。您可以完全放弃async修饰符并使用Task.FromResult同步返回已完成的任务:这会处理警告并具有更好的性能,因为它不需要异步方法的状态机开销。然而,这确实改变了异常处理的语义。如果这是一个问题,那么您应该使用同步异步方法方法并接受警告(或通过注释将其关闭):#pragmawarningdisable1998asyncTaskISomething.DoSomethingAsync()#pragmawarningrestore1998{returnDoSomethingElse();正如StephenCleary建议的那样,您还可以通过等待完成的任务(同时保持方法同步)来处理该警告:asyncTaskISomething.DoSomethingAsync()//或.Net4.6中的Task.CompletedTaskreturnDoSomethingElse();这真的取决于你的方法在做什么:没有I/O,可以忽略不计的cpu工作你应该同步计算结果并创建一个包含结果的任务。TaskISomething.DoSomethingAsync(){Foo结果;//做一些不影响性能的事情//这里没有I/OreturnTask.FromResult(result);但是注意,调用方法时会抛出任何异常,而不是await任务时抛出异常。对于适合其他类型工作的后一种情况,您应该使用异步:asyncTaskISomething.DoSomethingAsync(){Fooresult;//做一些不影响性能的事情//这里没有I/O返回结果;cpu密集型工作你应该使用Task.Run来启动任务并在任务中执行cpu密集型工作。TaskISomething.DoSomethingAsync(){returnTask.Run(()=>{Fooresult;//在这里做一些CPU密集型工作returnresult;});对于I/O密集型工作,您应该使用async关键字并等待任何异步I/O方法。不要使用同步I/O方法。以上就是C#学习教程:ToTask.RunornottorunTask.Run分享的全部内容。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——asyncTaskISomething.DoSomethingAsync(){Streams=new....//oranyotherasyncI/O操作vardata=awaits.ReadToEndAsync();返回新的Foo(数据);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
