Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как прервать асинхронный вызов хранимой процедуры / 5 сообщений из 5, страница 1 из 1
28.09.2006, 12:12
    #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
28.09.2006, 13:08
    #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
28.09.2006, 13:25
    #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
28.09.2006, 13:34
    #34018782
Crypto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прервать асинхронный вызов хранимой процедуры
Так, возможно я переборщил с транзакцией.
Сейчас на Rollback() никаких исключений не валится.

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


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