Как остановить поток в ThreadPool? - PullRequest
2 голосов
/ 22 февраля 2011

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

ThreadPool.QueueUserWorkItem(a => action.DoLongAction());

public void DoLongAction()
{
    var sql = Tables.Where(el => el.Some == "XXX"); // dynamically constructed LINQ query to database
    var result = db.Query(sql);
}

Я не могу использовать сигналы флагов, чтобы остановить эту тему. Потому что длительная операция не в моем коде, а в процессе работы с базой данных (запрос sql около 5 минут).

Как правильно остановить эту тему?

UPD1. Не простой SQL, но LINQ (EF4, BLToolkit)

Ответы [ 4 ]

3 голосов
/ 22 февраля 2011

Рассмотрите возможность использования класса BackgroundWorker .Он поддерживает отмену.Но вы можете отменить запрос только безопасным способом, если поставщик базы данных поддерживает его отмену.Ваш код не выглядит так, как будто он поддерживает отмену.

Обновление: после некоторого обсуждения стоит добавить в ответ следующую информацию:
SqlCommand поддерживает отмену, как указывает Гийом, но база данныхИспользуемый драйвер должен также поддерживать его.Поэтому лучший способ сделать это:
Использовать SqlCommand или производный от него класс для вашей СУБД, выполнить запрос и попытаться отменить его и посмотреть, поддерживается ли он.Если это не поддерживается, вы получите исключение.
Если это поддерживается, пример SqlCommand.Cancel поможет вам реализовать желаемое поведение.

2 голосов
/ 22 февраля 2011

Если вы хотите отменить команду SQL, взгляните на документацию SqlCommand.Cancel .

1 голос
/ 22 февраля 2011

Если вам действительно нужно прервать эту тему вручную, вы можете использовать класс Тема . Подробнее о том, как его использовать, вы можете посмотреть на этом онлайн-ресурсе .

Обратите внимание, что обычно использование Thread.Abort(); не рекомендуется, за исключением случаев, когда вы заканчиваете свою программу и хотите завершить все запущенные потоки.

В вашем случае, когда вы пытаетесь завершить SQL-запрос, вы должны искать другие способы его остановки ( SqlCommand.Cancel () , ISession.CancelQuery (), ...)

0 голосов
/ 22 февраля 2011

Вы также можете добавить значение тайм-аута для команды SQLCommand.иначе, отмените через x секунд, если не закончите.

...