2012-03-02 6 views
3

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

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

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

Что было бы лучшим способом разоблачить этот DbCommand от Dapper?

+0

Это в настоящее время не подвергается, и я не могу думать о каких-либо * легко * способы добавления его, короткие прохождения в интерфейсе, который рекламирует событие ... Я предполагаю, что этот конкретный пример является скорее исключением, чем нормой? Возможно, код * только этот * вручную? –

+0

Я думал, что я, наконец, избавился от ручного материала datareader ... Не думаю. Но все же я люблю Даппера. – Rik

+0

Если у вас есть определенные идеи по этому поводу, я все уши ... но .... Я не вижу никакого * легкого * пути = –

ответ

0

Это время молотка. Перерыв.

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(); 
    } 
}