为什么使用Task.Run围绕简单的异步方法调用创建新任务?

时间:2017-09-28 16:50:16

标签: c# asynchronous async-await

这是我在某些代码中看到的模式:

result = await Task.Run(async () => await MyAsynchronousMethod());

并且我没有看到这样做不起作用:

result = await MyAsynchronousMethod();

这里的前建筑有什么意义?

1 个答案:

答案 0 :(得分:3)

Task.Run在线程池上启动将执行async方法的任务。所以在第一种情况下,async方法本身将在后台线程上调用。

在第二种情况下,MyAsynchronousMethod方法将在调用线程上同步运行,就像任何其他非异步方法一样,直到它到达await。这个可能阻塞调用线程,至少暂时一段时间,具体取决于async方法的实现方式。

有一些实现不当的async方法阻塞调用线程,然后命中await并在UI应用程序中调度此调度线程上的方法例如冻结应用程序。