Отмена запроса к базе данных - PullRequest
3 голосов
/ 25 июля 2011

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

Проблема проста: некоторые транзакции базы данных в моем приложении длинные (секунды, минуты). Это может быть результатом двух вещей: один запрос запрашивается для обработки большого количества данных или несколько запросов выполняются для серии извлеченных данных. Во многих случаях обе вещи находятся в игре. Это приводит к зависанию пользовательского интерфейса и, что еще хуже, он не может отменить это.

Решение также кажется простым: переместите эти транзакции в другой поток, а затем уничтожьте этот поток, если это необходимо.

Однако многие люди здесь, в Интернете, выступают против убийства тем. Они предлагают использовать DbCommand.Cancel (), который является потокобезопасной операцией. Но другие люди говорят, что нет никакой гарантии, что эта команда отменит запрос. Представлена ​​еще большая проблема: как поток пользовательского интерфейса может узнать, какой DbCommand выполняет, когда пользователь нажимает? Черт, поток мог обрабатывать данные в памяти в этот момент.

Можете ли вы пролить свет на эту тему?

1 Ответ

2 голосов
/ 25 июля 2011

нет никакой гарантии, что эта команда отменит запрос

Это зависит от провайдера. Некоторые провайдеры не поддерживают отмену команд, но SQL Server поддерживает, поэтому это не должно быть проблемой. Конечно, это также зависит от типа выполняемой команды ...

Представлена ​​еще большая проблема: как поток пользовательского интерфейса может узнать, какой DbCommand выполняет, когда пользователь нажимает кнопку?

DbCommand.Cancel - это метод экземпляра, а не статический метод ... поэтому вам нужно сохранить ссылку на выполняемую команду и вызвать отмену в этом экземпляре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...