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

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

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

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

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

为了尝试扩展@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中的Returning Early from ASP.NET Requests以获取自定义实现。 这两篇优秀的文章都来自@StephanCleary

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

即使任务不是独立的,您仍然可以以某种方式对它们进行排序,以使它们在执行时更有效。

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

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