使用Task.Run调用异步方法似乎不对?我最近遇到了我们为我们工作的承包商编写的这段代码。它要么非常聪明,要么非常愚蠢(我认为是后者,但我想要第二个意见)。我不是在等待异步速度。基本上它是这样工作的:}publicasyncTaskSendAsync(TemplatedMessageDtomessage){//codedoingstuffvarresults=await_externalresource.DothingsExternally();//codedoingstuff}据我所知,第一个Task.Run()是毫无意义且效率低下的吗?应该是:publicboolSend(TemplatedMessageDtomessage){returnSendAsync(message)).GetAwaiter().GetResult();}publicasyncTaskSendAsync(TemplatedMessageDtomessage){//codedoingstuffvarresults=await_externalresource.Dothings)Externally(;//codedoingstuff}我也不相信这真的是一个异步方法,因为它还在等待,对吗?我认为唯一的优势(甚至是重写)是释放主工作线程。有人可以确认第一个任务不应该存在吗?我也不相信它真的是一个异步方法,因为它仍在等待,对吧?正如Yuval所解释的那样,它没有。你不应该使用同步异步。据我所知,第一个Task.Run()是毫无意义且效率低下的?不是真的,以这种方式使用Task.Run是有价值的.由于您阻塞了一个异步方法(您不应该阻塞),因此您可能会死锁。当您拥有SynchronizationContextUI应用程序和asp.net时,就会发生这种情况。使用Task.Run清除SynchronizationContext,因为它将工作卸载到ThreadPool线程并消除了死锁的风险。因此,阻塞是不好的,但如果您最终使用Task.Run会更安全。我也不相信它真的是一种异步方法,因为它仍在等待,对吧?您的承包商所做的是使用同步的异步反模式。他这样做可能是为了避免创建一个同步完成其工作的附加方法。他不必要地调用Task.Run并立即用GetResult阻止它。使用GetAwaiter().GetResult()将传播内部异常(如果发生这种情况),而不是包装的AggregateException。我认为唯一的优势(甚至是重写)是释放主工作线程。您的版本和他的版本将在执行时阻塞主线程,而他的版本也将通过使用线程池线程来执行此操作。正如Bar所提到的,这有助于避免与同步上下文编组相关的问题出现死锁。如果需要,我建议创建一个同步等效项。以上就是C#学习教程:用Task.Run调用异步方法好像不对?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
