gpt4 book ai didi

c# - 使用 Dapper.NET 异步 API 时如何遵守 CommandTimeout

转载 作者:行者123 更新时间:2023-12-05 06:41:17 25 4
gpt4 key购买 nike

我注意到在 Dapper.NET 中使用异步 API 时,我在扩展方法中传递的命令超时值没有得到遵守。然后我遇到了 MSDN documentation SqlCommand.CommandTimeout 的,这似乎是它不受“支持”的东西。

The CommandTimeout property will be ignored during asynchronous method calls such as BeginExecuteReader.

我在基类中使用以下方法。

public async Task<int> ExecuteAsync(string sql, object param = null,
CommandType commandType = CommandType.Text, int? commandTimeout = null, IDbTransaction transaction = null)
{
using (var connection = Connection)
{
Task<int> queryTask = connection.ExecuteAsync(sql, param, transaction, commandTimeout ?? CommandTimeoutDefault, commandType);
int result = await queryTask.ConfigureAwait(false);
connection.Close();
connection.Dispose();
return result;
}
}

public async Task<IEnumerable<TEntity>> QueryAsync(string sql, object param = null,
CommandType commandType = CommandType.Text, int? commandTimeout = null, IDbTransaction transaction = null)
{
using (var connection = Connection)
{
Task<IEnumerable<TEntity>> queryTask = connection.QueryAsync<TEntity>(sql, param, transaction, commandTimeout ?? CommandTimeoutDefault, commandType);
IEnumerable<TEntity> data = await queryTask.ConfigureAwait(false);
connection.Close();
connection.Dispose();
return data;
}
}

假设 CommandTimeoutDefault 是 30,我可以确定仍然会评估耗时 50 秒的请求。

有没有想过如何使用异步 Dapper.NET API 在超时间隔内断开和处理连接?

最佳答案

令人苦恼的是,SqlClient 确实会自己处理这个问题!但是,我想知道您是否可以做一些涉及:

  • 您传递给 dapper 的取消 token (它接受它们)
  • 调用 Task.Delay 超时
  • 调用 Task.WhenAny 传入 dapper 任务和延迟任务
  • 检查哪个从 WhenAny 返回 - 如果是延迟,则发出取消信号并抛出您自己的超时
  • 确保由取消引起的任何异常都得到妥善处理

有点难看,如果 DB 提供者本身不遵守超时,也许这是库应该封装的东西。可能还需要额外的步骤来彻底取消执行中的命令,在这种情况下,也许只有库可以正确地执行此操作(因为只有库可以访问命令)

关于c# - 使用 Dapper.NET 异步 API 时如何遵守 CommandTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40871424/

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