powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как прервать асинхронный вызов хранимой процедуры
5 сообщений из 5, страница 1 из 1
Как прервать асинхронный вызов хранимой процедуры
    #34018382
Crypto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот примерный код вызова хранимой процедуры асинхронно (ADO.NET 2). В любой момент пользователь может отменить задачу. ( CheckTaskStatus возвращает ее статус).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
bool isCanceled = false;
SqlCommand command = new SqlCommand("myStoredProc",...);
command.CommandType = CommandType.StoredProcedure;
IAsyncResult result = command.BeginExecuteNonQuery();
while(!result.IsCompleted)
{
	// проверяем, не отменена ли задача?
	if(CheckTaskStatus() == TaskStatuses.Canceled)
	{
                isCanceled = true;
		// останавливаем выполнение
                // ЧТО ТУТ НУЖНО НАПИСАТЬ, ЧТОБЫ ПРЕРВАТЬ (!) ВЫПОЛНЕНИЕ КОМАНДЫ?
		break;
	}
	// "спим" чтобы не грузить поток
	System.Threading.Thread.Sleep(  100  );
}
// завершаем отбработку команды
command.EndExecuteNonQuery( result );

if (isCanceled)
{
       // действия при отмене...
}

Теперь вопрос: Как правильно прервать выполнение команды?
Сразу скажу, что command.Cancel() нельзя использовать (вроде как), т.к. она "не предназначена для отмены pending asynchronious queries" (см. Help). Также если просто выйти из цикла (или сразу вызвать command.EndExecuteNonQuery( result )), то выполнение программы останавливается до полного выполнения команды.

Заранее спасибо.
...
Рейтинг: 0 / 0
Как прервать асинхронный вызов хранимой процедуры
    #34018648
Dmitry MSMS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Are you sure you didn't missread anything

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/async2.asp


Canceling Pending Commands
The command object has a Cancel() method that can be used to cancel an executing command.
...
Рейтинг: 0 / 0
Как прервать асинхронный вызов хранимой процедуры
    #34018734
Crypto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этом документе действительно написано, чо нащдо использовать Cancel().
А в хелпе по этому методу написано:
The Cancel method cannot be used to cancel a pending asynchronous operation.

Более того, я естественно попробовал использовать этот метод. ПОсле его вызова command.IsComplete==true, но дальше при вызове command.EndExecuteNonQuery( result ) генерируется SqlException:
"A severe error occurred on the current command. The results, if any, should be discarded. Operation cancelled by user."

Но и это не самое страшное. Думаю, может так оно и надо. Закэтчу я это исключение и все. Но вся эта конструкция обернута в транзакцию. И похожее исключение генерируется и на transaction.Rollback(). Блокировка на таблицы после этого кстати так и не снимаются, пока не закрывается соединение...
Это нормальное поведение при работе с command.Cancel()?
...
Рейтинг: 0 / 0
Как прервать асинхронный вызов хранимой процедуры
    #34018782
Crypto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, возможно я переборщил с транзакцией.
Сейчас на Rollback() никаких исключений не валится.

Т.о. можно предположить, что для прерывания асинхронного выполнения достаточно вызвать command.Cancel() и после этого НЕ ВЫЗЫВАТЬ command.EndExecuteNonQuery()?
...
Рейтинг: 0 / 0
Как прервать асинхронный вызов хранимой процедуры
    #34020598
Sasha Bilyck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть удобный но не идеальный компонент для для фоновых но контролируэмых процесов: BackgroundWorker
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как прервать асинхронный вызов хранимой процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]