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
.