Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Как прервать асинхронный вызов хранимой процедуры  [new]
Crypto
Member

Откуда: Ярославль
Сообщений: 54
Вот примерный код вызова хранимой процедуры асинхронно (ADO.NET 2). В любой момент пользователь может отменить задачу. ( CheckTaskStatus возвращает ее статус).
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 )), то выполнение программы останавливается до полного выполнения команды.

Заранее спасибо.
28 сен 06, 12:12    [3195657]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать асинхронный вызов хранимой процедуры  [new]
Dmitry MSMS
Member

Откуда:
Сообщений: 19
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.
28 сен 06, 13:08    [3196159]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать асинхронный вызов хранимой процедуры  [new]
Crypto
Member

Откуда: Ярославль
Сообщений: 54
В этом документе действительно написано, чо нащдо использовать 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()?
28 сен 06, 13:25    [3196326]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать асинхронный вызов хранимой процедуры  [new]
Crypto
Member

Откуда: Ярославль
Сообщений: 54
Так, возможно я переборщил с транзакцией.
Сейчас на Rollback() никаких исключений не валится.

Т.о. можно предположить, что для прерывания асинхронного выполнения достаточно вызвать command.Cancel() и после этого НЕ ВЫЗЫВАТЬ command.EndExecuteNonQuery()?
28 сен 06, 13:34    [3196412]     Ответить | Цитировать Сообщить модератору
 Re: Как прервать асинхронный вызов хранимой процедуры  [new]
Sasha Bilyck
Member

Откуда: Украина Хмельницкий-Львов
Сообщений: 44
есть удобный но не идеальный компонент для для фоновых но контролируэмых процесов: BackgroundWorker
29 сен 06, 00:49    [3199521]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить