Dapper.NET で非同期 API を使用すると、拡張メソッドで渡すコマンド タイムアウト値が考慮されないことに気付きました。次に、SqlCommand.CommandTimeout のMSDN ドキュメントに出くわしましたが、これは「サポート」されていないようです。
CommandTimeout プロパティは、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;
}
}
30 とします。50CommandTimeoutDefault
秒かかるリクエストでも評価されることがわかります。
非同期 Dapper.NET API を使用して、タイムアウト間隔で接続を切断して破棄する方法はありますか?