c# - 在以下案例实例中,我应该使我的 SQL 查询异步吗?

标签 c# sql-server database asynchronous

总结一下我的问题:我必须对 3 个不同的端点进行 3 次单独调用。我必须通过大量记录以编程方式执行此操作。其中两个调用是使用异步 HTTP 请求对两个不同的调用进行的,我在其中使用了 aysnc await。我必须进行的第三次调用是对没有 API 包装器的 MS SQL 数据库的查询。对 API 的两次调用各用时约 22 秒,对数据库的查询用时约 2 秒。单独来看这很好,但是当我将 MS SQL 查询作为方法链的一部分时,整个事情就变得同步了。我本来可以为用户节省大量时间来同时查询两个 API,但我的应用程序将等待这些查询完成,然后再尝试对数据库进行下一次调用。

我之前听说数据库查询是事务性的,不能异步。我想知道这是否属实,我是否真的可以对数据库进行真正的异步调用。

我的另一个选择是预填充 List<T>执行作业时,我可以根据对数据库的一系列 SQL 查询创建的对象。然而,我担心的是这个列表中存储的对象的潜在数量,对于需要处理数十万条记录的某些作业来说,它是否会有内存过载的危险,或者可能是搜索对象以提取正确的速度值(value)观。

最佳答案

when I make the MS SQL query part of the method chain, the entire thing becomes synchronous.

这是一个不正确的实现。您当然可以在单个函数内混合使用同步和异步调用。

假设您有这三种方法:

async Task<Result1> FirstQueryAsync() {
    ...
}
async Task<Result2> SecondQueryAsync() {
    ...
}
Result3 QueryDb() {
}

你可以这样写:

async Task<OverallResult> QueryThreeSources() {
    // Fire off async queries
    var firstTask = FirstQueryAsync().ConfigureAwait(false);
    var secondTask = SecondQueryAsync().ConfigureAwait(false);
    // Do synchronous query
    var third = QueryDb();
    // Await the results of the other two
    var first = await firstTask;
    var second = await secondTask;
    return Combine(first, second, third);
}

I have previously been told that database queries are transactional and cannot be made asynchronous.

这是不正确的。查询的事务性质体现在 RDBMS 内部的 RDBMS 端。这完全独立于您的程序是同步还是异步接收数据的决定。 .NET 提供了用于访问 SQL Server 的异步 API,因此您绝对可以使用异步风格重写您的数据库代码。

My other option is to pre-populate a List<T> of objects that I can create from the series of SQL queries to the database when the job is executed.

列表选项只有在您多次查询相同数据时才有用。如果您的所有查询都倾向于带来不同的数据子集,这些子集与存储在您查询的表中的整体数据相比较小,则将数据缓存在 List<T> 中。 s 通常适得其反。

关于c# - 在以下案例实例中,我应该使我的 SQL 查询异步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38812716/

相关文章:

MySQL首先根据参数值选择列,然后选择列的值

mysql - MySQL不使用LIMIT来优化查询选择功能吗?

c# - 如何在代码中向 WPF 窗口添加形状?

c# - 日期时间 "null"值

c# - 可以使用 XML 列来存储额外的数据吗?

sql-server - 当拥有身份列不是一个好主意时?

php - 在数据库中存储考试数据的最佳方法

C# 8.0 对多维数组使用 Range

C# 属性限制

sql-server - 在 SQL Server 中创建计算持久列用作主键