ASP.NET MVC不执行并行的异步函数

时间:2017-08-01 06:04:26

标签: jquery asp.net-mvc async-await

我使用jquery ajax调用向我的asp.net mvc应用程序发送多个请求。处理此请求的方法是异步的,它在我的oracle数据库上执行查询。但这些查询不会并行发送到数据库。为什么不将它们全部并行发送?这是异步控制器方法:

public async Task<int> GetVoltageRowCount(pLayerName)
{
    DataWrapper featuresDataWrapper = new DataWrapper(pLayerName);
    int rowCount = await Task.Factory.StartNew<int>(() => featuresDataWrapper.GetRowCount());
    return rowCount;
}

这是客户请求。 (并行发送) jquery ajax request 这是V $ SQL oracle表。发送所有请求大约需要34秒。 V$SQL table

3 个答案:

答案 0 :(得分:1)

您不应该使用Task.RunTask.Factory.StartNew。看来你实际上并不了解异步是什么。即,它并行处理。所有async都允许在运行线程进入等待状态时将其返回到池中。线程通常是有限的商品;他们有开销和消耗系统资源。在类似Web服务器的东西中,线程池的上限通常为1000,这意味着在任何给定时间都可以有1000个活动线程。 Async只允许空闲的线程返回到池中,这样它们就可以用来做额外的工作,而不是只是闲置。

在Web服务器的上下文中,为每个请求分配一个线程。这就是为什么服务器上的线程上限通常被称为&#34; max requests&#34;。一个请求总是等于至少一个线程。执行类似创建新线程的操作,从池中获取另一个线程,因此现在您的单个请求位于两个线程上(有效地将服务器的潜在吞吐量减半)。现在,如果操作是异步的,则第一个线程将返回到池中,因为新线程现在处于活动状态,而原始线程现在处于空闲状态。但是,这意味着你没有给自己买任何东西:你只是将一个线程换成了另一个线程,并增加了一堆不必要的开销。创建新线程与后台处理相同;这是一种常见且危险的误解。

简单明了,在操作完成所有工作之前,服务器无法返回响应。无论你使用一个线程还是一千个线程,都没有在响应时间方面没有区别(除了使用多个线程实际上增加你的响应时间,导致更多延迟,而不是更少)。即使异步完成也会实际上增加您的响应时间,即使只是微秒。这是因为异步具有固有的开销。同步始终更快。异步的好处是,您可以更有效地利用资源,发生任何事情&#34;更快&#34;。

答案 1 :(得分:1)

最有可能的是,ASP.NET启用了session state,它会故意序列化给定用户的所有请求。试试changing the session state to ReadOnly or disabled

答案 2 :(得分:0)

您不应将Task.Factory.StartNewasync-await混在一起。请改用Task.Run

但是,由于它是一个ASP.NET应用程序,通过执行同步异步,您只需从一个线程池线程切换到另一个线程池线程,然后转换到另一个线程池线程,这将使整个系统变慢。 / p>