Прервать выполнение SqlConnection.Open
От: SelfCoder  
Дата: 24.10.07 22:39
Оценка:
Подскажите как корректно прервать SqlConnection.Open(). Пробовал запускать в отдельном потоке, но при вызове Abort для этого потока из основного — программа всё равно подвисает. Как это сделано в Management Studio?
Re: Прервать выполнение SqlConnection.Open
От: pvnic  
Дата: 25.10.07 04:52
Оценка:
Здравствуйте, SelfCoder, Вы писали:

SC>Подскажите как корректно прервать SqlConnection.Open(). Пробовал запускать в отдельном потоке, но при вызове Abort для этого потока из основного — программа всё равно подвисает. Как это сделано в Management Studio?



хочется прервать долгое обращение при некорректных данных?

>но при вызове Abort для этого потока из основного — программа всё равно подвисает.

а это зачем делать вообще? ну забудь про него да и все... Или сделай асинхронный вызов.
Re: Прервать выполнение SqlConnection.Open
От: OrSol  
Дата: 25.10.07 06:26
Оценка:
Здравствуйте, SelfCoder, Вы писали:

SC>Подскажите как корректно прервать SqlConnection.Open(). Пробовал запускать в отдельном потоке, но при вызове Abort для этого потока из основного — программа всё равно подвисает. Как это сделано в Management Studio?


может просто таймаут меньше сделать?
... << RSDN@Home 1.2.0 alpha rev. 729>>
Re: Прервать выполнение SqlConnection.Open
От: vdimas Россия  
Дата: 25.10.07 09:41
Оценка:
Здравствуйте, SelfCoder, Вы писали:

SC>Подскажите как корректно прервать SqlConnection.Open(). Пробовал запускать в отдельном потоке, но при вызове Abort для этого потока из основного — программа всё равно подвисает. Как это сделано в Management Studio?


Запусти как асинхронный вызов (например, асинхронный вызов делегата). При уничтожении вызывающего потока, согласно документации, должно прерваться и асинхронное задание. Т.е. создай вспомогательный поток, из него вызови нужный код асинхронно, и жди в этом потоке через Sleep завершения, проверяя заодно некий флаг принудительного выхода (для простого типа инхронизация доступа к флагу необязательна). Это позволит нормально завершить твой вспомогательный поток, Abort юзать настоятельно не рекомендуется.
Re[2]: Прервать выполнение SqlConnection.Open
От: SelfCoder  
Дата: 27.10.07 17:10
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Запусти как асинхронный вызов (например, асинхронный вызов делегата). При уничтожении вызывающего потока, согласно документации, должно прерваться и асинхронное задание. Т.е. создай вспомогательный поток, из него вызови нужный код асинхронно, и жди в этом потоке через Sleep завершения, проверяя заодно некий флаг принудительного выхода (для простого типа инхронизация доступа к флагу необязательна). Это позволит нормально завершить твой вспомогательный поток, Abort юзать настоятельно не рекомендуется.


Попробовал, не помогло. После входа в медот Open поток никаким образом прервать не удается. Выход один — прерывать поток не из основного потока (GUI), а в отдельном специально созданном для этого, например способом вызова асинхронного делегата.
Re[3]: Прервать выполнение SqlConnection.Open
От: Saruwatari Россия  
Дата: 28.10.07 11:37
Оценка:
Здравствуйте, SelfCoder, Вы писали:

SC>Здравствуйте, vdimas, Вы писали:


V>>Запусти как асинхронный вызов (например, асинхронный вызов делегата). При уничтожении вызывающего потока, согласно документации, должно прерваться и асинхронное задание. Т.е. создай вспомогательный поток, из него вызови нужный код асинхронно, и жди в этом потоке через Sleep завершения, проверяя заодно некий флаг принудительного выхода (для простого типа инхронизация доступа к флагу необязательна). Это позволит нормально завершить твой вспомогательный поток, Abort юзать настоятельно не рекомендуется.


SC>Попробовал, не помогло. После входа в медот Open поток никаким образом прервать не удается. Выход один — прерывать поток не из основного потока (GUI), а в отдельном специально созданном для этого, например способом вызова асинхронного делегата.


Попробуй заменить [STAThread] на [MTAThread] и запускать коннект в дополнительном потоке. Либо ройся в области многопоточности COM-объектов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.