2

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 を使用して、タイムアウト間隔で接続を切断して破棄する方法はありますか?

4

2 に答える 2