|
|
|
Как прервать асинхронный вызов хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
Вот примерный код вызова хранимой процедуры асинхронно (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. Теперь вопрос: Как правильно прервать выполнение команды? Сразу скажу, что command.Cancel() нельзя использовать (вроде как), т.к. она "не предназначена для отмены pending asynchronious queries" (см. Help). Также если просто выйти из цикла (или сразу вызвать command.EndExecuteNonQuery( result )), то выполнение программы останавливается до полного выполнения команды. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 12:12 |
|
||
|
Как прервать асинхронный вызов хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
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.09.2006, 13:08 |
|
||
|
Как прервать асинхронный вызов хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
В этом документе действительно написано, чо нащдо использовать 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.09.2006, 13:25 |
|
||
|
Как прервать асинхронный вызов хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
Так, возможно я переборщил с транзакцией. Сейчас на Rollback() никаких исключений не валится. Т.о. можно предположить, что для прерывания асинхронного выполнения достаточно вызвать command.Cancel() и после этого НЕ ВЫЗЫВАТЬ command.EndExecuteNonQuery()? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 13:34 |
|
||
|
|

start [/forum/topic.php?fid=17&gotonew=1&tid=1353132]: |
0ms |
get settings: |
12ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
67ms |
get topic data: |
11ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 413ms |

| 0 / 0 |
