【问题标题】:ASP.NET MVC not executing async function parallelASP.NET MVC 不并行执行异步函数
【发布时间】:2018-01-07 20:41:08
【问题描述】:

我使用 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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 做到了。谢谢。但是在禁用会话的情况下,即使没有“等待异步”,所有请求也会同时发送。现在它快得多。这是唯一的方法吗?我必须禁用会话?
    • 如果您确实需要在操作中从会话中读取数据,您可以将会话设为只读。如果启用了会话(读/写),那么它们会自动序列化,阻止并行执行。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      但是,由于它是一个 ASP.NET 应用程序,通过异步而不是同步,您只是从一个线程池线程切换到另一个线程池线程,然后再切换到另一个线程池线程,这会使整个系统变慢。

      【讨论】:

      • 那么有没有办法改进这个?让asp.net并行向数据库发送请求?
      • 那行不通。仍然没有并行发送。 @Paulo Morgado
      • 数据库是否允许并行访问?如果您想要的是并行而不是异步,请尝试 TPL 中的 ParallelForEach。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      相关资源
      最近更新 更多