gpt4 book ai didi

c# - ExecuteScalarAsync 挂起但 ExecuteScalar 立即返回

转载 作者:太空狗 更新时间:2023-10-30 01:17:37 25 4
gpt4 key购买 nike

所以我遇到了一个让我困惑的小问题,我一直无法找到一个很好的解释 - 我想我可能以某种方式误用了 async/await 功能,但我真的不知道'我不知道我做错了什么。

所以我有一些查询我的数据库并返回单个值的 sql 代码。因此,我使用 ExecuteScalarAsync 将该值输出到 c# 中。

代码如下:

public void CheckOldTransactionsSync()
{
CheckOldTransactions().Wait();
}

public async Task CheckOldTransactions()
{
DateTimeOffset beforeThis = DateTime.UtcNow.Subtract(TimeSpan.FromHours(6));

using (SqlConnection connection = new SqlConnection(SqlConnectionString))
{
await connection.OpenAsync(cts.Token);
using (SqlCommand command = new SqlCommand(@"SELECT TOP 1 1 AS value FROM SyncLog WHERE [TimeStamp] < @BeforeThis;", connection))
{
command.Parameters.Add("@BeforeThis", System.Data.SqlDbType.DateTimeOffset, 7);

command.Prepare();
command.Parameters["@BeforeThis"].Value = beforeThis;

Int32 oldTransactions = (Int32)await command.ExecuteScalarAsync(cts.Token);

// do stuff with oldTransactions
}
}
}

因此在我的代码的其他地方创建了名为 cts 的 CancellationTokenSource,并使用 CancelAfter 方法将其设置为在 2 分钟后过期。

现在,我已经使用调试器逐步执行了这段代码,并且到达了等待调用 ExecuteScalarAsync 的那一行,没有出现任何问题。但是,我似乎对该行的执行有两个问题,一个是它似乎没有返回,另一个是它忽略了我的取消 token ,并且在我的两分钟取消 token 过期后仍在运行一段时间。

现在我在 Sql Studio 中运行了 sql 查询,它返回得非常快——此时表只有大约 4000 行。

我已经通过将该行更改为现在解决了问题:

Int32 oldTransactions = (Int32) command.ExecuteScalar();

几乎立即返回。

那是我更改过的唯一一行代码,我将其改回以确保发生同样的问题。所以我的问题是,异步调用做错了什么?

最佳答案

您正在调用 Wait

那是一个 classic ASP.NET deadlock.不要阻塞,也不要使用同步 IO。

关于c# - ExecuteScalarAsync 挂起但 ExecuteScalar 立即返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31023850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com