C# 如果我们对异步处理进行了数据库调用,它是否真的有帮助?

C# 如果我们对异步处理进行了数据库调用,它是否真的有帮助?,c#,asynchronous,C#,Asynchronous,在服务器中,如果我有一个异步函数,它将处理一些数据库调用并从表中获取一些记录。如果服务器接收到大量请求,那么该数据库调用实际上可能会阻塞,并且我们实际上没有异步工作 当我们在服务器进程中有一些数据库调用时,异步方法有帮助吗 如果没有,这些方法会产生什么问题 我不想将其定制为特定的数据库,因为这样我的问题就会偏离主题。我只想在这里围绕异步编程范式展开讨论。如果有关于数据库获取操作的优化方法的建议,那么欢迎。我只想知道如何从一开始就进行正常的获取。这里有两个潜在的问题,第一个问题可以通过使用异步方法

在服务器中,如果我有一个异步函数,它将处理一些数据库调用并从表中获取一些记录。如果服务器接收到大量请求,那么该数据库调用实际上可能会阻塞,并且我们实际上没有异步工作

  • 当我们在服务器进程中有一些数据库调用时,异步方法有帮助吗

  • 如果没有,这些方法会产生什么问题


  • 我不想将其定制为特定的数据库,因为这样我的问题就会偏离主题。我只想在这里围绕异步编程范式展开讨论。如果有关于数据库获取操作的优化方法的建议,那么欢迎。我只想知道如何从一开始就进行正常的获取。

    这里有两个潜在的问题,第一个问题可以通过使用异步方法解决,第二个问题只能通过调整数据库来解决

    使用异步方法将允许您的客户端在等待服务器时执行其他处理,即在UI情况下保持响应

    数据库锁定问题只能通过分析负载下的数据库来解决,以查看哪些表被锁定,哪些存储的进程或进程导致了锁定


    如果确实需要大量请求,您可能需要研究内存缓存或其他优化。

    这里有两个潜在问题,第一个问题可以通过使用异步方法解决,第二个问题只能通过调整数据库来解决

    使用异步方法将允许您的客户端在等待服务器时执行其他处理,即在UI情况下保持响应

    数据库锁定问题只能通过分析负载下的数据库来解决,以查看哪些表被锁定,哪些存储的进程或进程导致了锁定


    如果确实需要大量的请求,您可能需要研究内存缓存或其他优化。

    在负载下的并发应用程序中,异步方法调用可以提高性能和吞吐量,因为调用线程被释放出来做其他工作

    在一些边缘情况下,它不会有帮助,但是如果应用程序花费大量时间来做任何事情,而不是等待来自数据库的数据,那么您应该会看到一些好处。这些好处适用于服务器端和GUI应用程序

    例如,如果您的应用程序花费300毫秒等待数据,300毫秒处理数据,并且您正在处理大量的同时请求,那么您可能会通过使用异步调用使吞吐量翻倍,因为请求数据的每个线程都将立即释放,然后可以处理前一个请求返回的数据

    您在实践中很少会看到这种程度的改进,因为请求不会以很好的时间间隔到达,而且通常每个请求都不需要相同的工作量。不过,差别应该是显而易见的

    然而,如果您花300毫秒等待数据,而只花10毫秒处理数据,您将看不到任何接近的改进

    在ASP.Net这样的环境中,这一点非常重要,因为可用于处理所有传入web请求的线程数量有限:如果所有线程都在数据库服务器上等待,则不会提供任何页面

    在windows窗体应用程序中,使用异步调用获取数据允许UI在获取数据时保持响应,允许用户在感到等待无聊时选择取消


    明显的缺点是,它使调用代码更加复杂。

    在负载下的并发应用程序中,异步方法调用可以提高性能和吞吐量,因为调用线程可以自由地执行其他工作

    在一些边缘情况下,它不会有帮助,但是如果应用程序花费大量时间来做任何事情,而不是等待来自数据库的数据,那么您应该会看到一些好处。这些好处适用于服务器端和GUI应用程序

    例如,如果您的应用程序花费300毫秒等待数据,300毫秒处理数据,并且您正在处理大量的同时请求,那么您可能会通过使用异步调用使吞吐量翻倍,因为请求数据的每个线程都将立即释放,然后可以处理前一个请求返回的数据

    您在实践中很少会看到这种程度的改进,因为请求不会以很好的时间间隔到达,而且通常每个请求都不需要相同的工作量。不过,差别应该是显而易见的

    然而,如果您花300毫秒等待数据,而只花10毫秒处理数据,您将看不到任何接近的改进

    在ASP.Net这样的环境中,这一点非常重要,因为可用于处理所有传入web请求的线程数量有限:如果所有线程都在数据库服务器上等待,则不会提供任何页面

    在windows窗体应用程序中,使用异步调用获取数据允许UI在获取数据时保持响应,允许用户在感到等待无聊时选择取消


    明显的缺点是,它使调用代码变得更加复杂。

    如果调用线程还有其他工作要做,那么在您描述的情况下,使用异步调用肯定会有助于提高吞吐量。例如,如果线程1处理对服务器的请求并进行数据库调用,即使使用.BeginInvoke(res)后跟.EndInvoke(res),您仍然会阻止该调用

    要正确地扩展,您需要确保线程1还有其他工作要做,可能需要准备另一个页面请求,直到它成为databa