Отменить длительный запрос Dapper

У нас есть приложение winforms, которое использует Dapper для чтения базы данных.

В одной форме у нас есть (возможный) длительный запрос в фоновом потоке.

Пользователи хотят иметь возможность отменить запрос, поэтому мне нужен доступ к DbCommand Dapper, который создает и вызывает Cancel, если он запущен, из другого потока.

Как лучше всего показать эту DbCommand из Dapper?


person Rik    schedule 02.03.2012    source источник
comment
В настоящее время это не отображается, и я не могу придумать никаких простых способов его добавления, кроме передачи интерфейса, который рекламирует событие... Я предполагаю, что этот конкретный пример является исключением а не норма? Возможно, код только этот вручную?   -  person Marc Gravell    schedule 02.03.2012
comment
Я думал, что наконец-то избавился от ручного чтения данных... Думаю, нет. Но все же я люблю Даппера.   -  person Rik    schedule 02.03.2012
comment
если у вас есть конкретные идеи по этому поводу, я внимательно слушаю... но.... я не вижу никакого простого способа =   -  person Marc Gravell    schedule 02.03.2012
comment
Ну, я думаю о том, чтобы ввести необязательный параметр интерфейса IQueryPipeline, который предоставляет события, необходимые для моей цели.   -  person Rik    schedule 02.03.2012
comment
@MarcGravell, как насчет того, чтобы просто разрешить нам доступ к нему через явное приведение? ((WrappedReader)reader).Cancel() или аналогичный.   -  person Chris Marisic    schedule 25.02.2015
comment
Интересно, были ли какие-либо последующие действия по этому поводу?   -  person Sklivvz    schedule 07.08.2019


Ответы (1)


Пришло время молотка. Разбить вещи.

using (var reader = connection.ExecuteReader(query)) {

.... сейчас отменить

var wrappedReaderType = typeof (Dapper.CommandDefinition)
                        .Assembly.GetType("Dapper.WrappedReader");
var field = wrappedReaderType
            .GetField("cmd", BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null)
{
    var command = field.GetValue(reader) as IDbCommand;
    if (command != null)
    {
        command.Cancel();
    }
}
person Chris Marisic    schedule 25.02.2015