我应该用Task.Run包装慢速调用吗?

时间:2014-06-18 22:34:08

标签: c# asp.net-mvc async-await

我有这个ASP MVC调用,它是异步的,因为它需要进行异步调用。我注意到有几个慢同步调用(例如数据库访问)。该方法需要提供所有返回的数据才能继续。

我想过用Task.Run包装同步调用并等待所有这些调用。

包装慢同步调用是否有意义?如果只有同步通话怎么办?

3 个答案:

答案 0 :(得分:5)

不要使用Task.Run来并行化服务器端代码中的工作,除非您希望同时服务的客户端请求数量非常少。否则,您可能会加快单个请求的处理速度,但是当有很多用户时,您的Web应用程序的可扩展性会受到影响。

答案 1 :(得分:2)

为了尝试扩展@Noseratio,将线程旋转到“加速”同步工作非常糟糕。

要记住的一件重要事情是在ASP.NET中使用Task.Run是非常危险的,因为运行时不知道您排队的工作需要完成,IIS可能会不时尝试回收您的应用程序这会导致工作无意间突然发生。

如果您使用的是.NET Framework 4.5.2,则可以通过HostingEnvironment.QueueBackgroundWorkItem获得解决方案。您可以在Fire and Forget on ASP.NET中详细了解相关信息。如果没有,请阅读Returning Early from ASP.NET Requests以获取自定义实现。这两篇优秀的文章都来自@StephanCleary

答案 2 :(得分:1)

如果任务是独立的(不依赖于来自其他任务的数据),并且可以独立执行,那么是的,无论如何都要异步执行它们。如果他们是实体框架及其版本6,那么它提供了异步方法来调用,而您不必将它们包装在Task.Run中。

即使任务不是独立的,您仍然可以通过某种方式对它们进行排序,以便在执行时提高效率。

是否使用Task.Run是一个重要的区别。 Task.Run将使用ThreadPool线程,如果它正在执行同步操作将阻塞,因此减少了应用程序可用的ThreadPool theads的数量。如果您有许多用户,并且您正在执行许多任务,那么这可能是个问题。

尝试查找异步api而不是使用Task.Run。