Cancelation token в асинхронном запросе Dapper

В дапере нет перегрузки у метода QueryAsync с токеном отмены для сложных запросов.

Сейчас вот так:

var purchases = await connection.QueryAsync(queryWithFilters, types, mapper,
    param: new { Skip = skip, Take = take },
    splitOn: "Id,Id,Id,Id,Id,Id,Id");

Здесь нужно внедрить отмену. В интернете не нашёл. В более лёгких запросах использую CommandDefinition.

Что делать?


Ответы (1 шт):

Автор решения: aepot

Если костылить то так:

var purchasesTask = connection.QueryAsync(queryWithFilters, types, mapper,
    param: new { Skip = skip, Take = take },
    splitOn: "Id,Id,Id,Id,Id,Id,Id");
const int timeout = 60000; //ms
var delayTask = Task.Delay(timeout, token); // CancellationToken
var fastest = await Task.WhenAny(purchasesTask, delayTask);

if (fastest == delayTask)
{
    // таймаут или отмена
}
else
{
    var purchases = purchasesTask.Result; // можно await, но Task уже гарантированно завершён, и здесь можно и нужно .Result
    // ...
}

Здесь запрос не прерывается, но выбрасывается в бездну. Впрочем, задача остановки ожидания выполняется, и если вам этого достаточно, то это вполне себе решение.

Но странно, что такой запрос никак не оформить через CommandDefinition.

→ Ссылка