我刚刚遇到一些代码,例如:
var task = Task.Run(async () => { await Foo.StartAsync(); });
task.Wait();
(不,我不知道内部运作Foo.StartAsync()
)。我最初的反应是摆脱async
/await
并重写为:
var task = Foo.StartAsync();
task.Wait();
这是正确的还是不正确的(再次强调,对Foo.StartAsync()
). This https://stackoverflow.com/a/31584851/8877回答它有什么区别 - 使用 Task.Run 运行“异步”操作委托... https://stackoverflow.com/questions/31583835/what-difference-does-it-make-running-an-async-action-delegate-with-a-task-ru似乎表明在某些情况下它可能有意义,但它也说“说实话,我还没有看到那么多场景......”
Normally, the intended用于Task.Run
是在非 UI 线程上执行 CPU 密集型代码。因此,它与async
委托,但这是可能的(例如,对于同时具有异步部分和 CPU 绑定部分的代码)。
然而,这就是预期的用途。我认为在你的例子中:
var task = Task.Run(async () => { await Foo.StartAsync(); });
task.Wait();
原作者更有可能尝试同步阻塞异步代码,并且(ab)使用Task.Run
to 避免这种情况下常见的死锁 http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html(正如我在博客上所描述的)。
本质上,它看起来像我在我的文章中描述的“线程池黑客”关于棕地异步代码的文章 https://msdn.microsoft.com/en-us/magazine/mt238404.aspx.
The best解决方案是不使用Task.Run
or Wait
:
await Foo.StartAsync();
这会导致async
通过代码库进行扩展,这是最好的方法,但目前可能会导致开发人员无法接受的工作量。这大概就是你的前任使用的原因Task.Run(..).Wait()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)