C# async和Wait是否有助于在应用程序短时间多个db调用时提高吞吐量?

C# async和Wait是否有助于在应用程序短时间多个db调用时提高吞吐量?,c#,asynchronous,async-await,C#,Asynchronous,Async Await,我正在使用的应用程序使用多个短期DB调用来读取和更新数据。一个调用的输出正被另一个调用使用 在这种情况下,对每个DB调用使用WAIT是否会导致吞吐量增加 应用程序和数据库分别托管 构建的概念验证实际上降低了吞吐量,我推测这是因为上下文切换的开销 同步版本大约提供8个请求/秒,而异步版本仅提供2.5个请求/秒 我已确保将httpTargetRuntime设置为4.5.2,使用aync并一直等待asmx服务,该服务使用APM样式的端点,如文件所述 我正在使用ADO.NET异步版本方法,并已在连接字符

我正在使用的应用程序使用多个短期DB调用来读取和更新数据。一个调用的输出正被另一个调用使用

在这种情况下,对每个DB调用使用WAIT是否会导致吞吐量增加

应用程序和数据库分别托管

构建的概念验证实际上降低了吞吐量,我推测这是因为上下文切换的开销

同步版本大约提供8个请求/秒,而异步版本仅提供2.5个请求/秒

我已确保将httpTargetRuntime设置为4.5.2,使用aync并一直等待asmx服务,该服务使用APM样式的端点,如文件所述

我正在使用ADO.NET异步版本方法,并已在连接字符串中设置Asynchronous Processing=True

  • async Wait是否应被视为适合短oltp事务
  • 如果上述问题是由于死锁引起的,如何进行故障排除。我们已经对代码进行了审查,没有观察到除了上面链接中提到的以外,任何地方直接从任务中使用
    .Result

  • 不,因为您没有并行访问它们。Async和Await只是将上下文返回给调用方,从而使主线程不必等待。但是,无论是否使用Async Wait,都需要完成相同数量的工作,并且需要等待每个调用将结果传递给下一个调用(加上上下文切换)


    我建议重写您的逻辑,以便能够只调用一个数据库请求,例如,在必要时创建一个存储过程。

    即使是客户端和服务器之间最短的事务,也会使线程上下文切换的成本相形见绌,这是假设线程上下文切换在100%的时间内都是必需的(异步操作可能需要也可能不需要上下文切换,这取决于它实际完成的方式)。要求堆栈溢出社区分享他们的经验是一个“过于宽泛”的问题的缩影。我想,“POC”是否会导致吞吐量下降取决于“POC”的确切含义。你没有费心定义这个缩写。应用程序和数据库在POC中是在同一台服务器上吗?@MikaelEliasson更新了问题。它使用不同的服务器。@PeterDuniho更新了POC详细信息EAH,但你仍然没有费心定义“POC”。你是说“概念证明”吗?为什么你让人们猜测你的意思?谢谢。我们将SP选项作为下一步。我知道响应时间不会因为async和Wait而减少,但由于空闲线程可用于处理其他请求,吞吐量不应该增加吗?是的,但只适用于在调用的线程中运行的其他请求异步方法(即用户界面),而不是等待的方法(即db连接)。例如,您的UI包含两个按钮(A和B)向数据库发出独立请求,这些请求的持续时间约为3秒。用户单击按钮a,一秒钟后单击按钮B。如果没有Async/Await,用户需要等待6秒才能完成这两个操作。使用Async/Await,两个调用的持续时间仅为4秒,因为现在它们是并行执行的(并且不冻结UI)。感谢您的示例。在我的例子中,这是一个ASMX Web服务公开,在执行负载测试时,与同步版本相比,获得的吞吐量更低,可能是由于上下文切换。您使用的是实体框架吗?