我有这个ASP MVC调用,它是异步的,因为它需要进行异步调用。我注意到有几个慢同步调用(例如数据库访问)。该方法需要提供所有返回的数据才能继续。
我想过用Task.Run包装同步调用并等待所有这些调用。
包装慢同步调用是否有意义?如果只有同步通话怎么办?
答案 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。