Подскажите как корректно прервать SqlConnection.Open(). Пробовал запускать в отдельном потоке, но при вызове Abort для этого потока из основного — программа всё равно подвисает. Как это сделано в Management Studio?
Здравствуйте, SelfCoder, Вы писали:
SC>Подскажите как корректно прервать SqlConnection.Open(). Пробовал запускать в отдельном потоке, но при вызове Abort для этого потока из основного — программа всё равно подвисает. Как это сделано в Management Studio?
хочется прервать долгое обращение при некорректных данных?
>но при вызове Abort для этого потока из основного — программа всё равно подвисает.
а это зачем делать вообще? ну забудь про него да и все... Или сделай асинхронный вызов.
Здравствуйте, SelfCoder, Вы писали:
SC>Подскажите как корректно прервать SqlConnection.Open(). Пробовал запускать в отдельном потоке, но при вызове Abort для этого потока из основного — программа всё равно подвисает. Как это сделано в Management Studio?
Здравствуйте, SelfCoder, Вы писали:
SC>Подскажите как корректно прервать SqlConnection.Open(). Пробовал запускать в отдельном потоке, но при вызове Abort для этого потока из основного — программа всё равно подвисает. Как это сделано в Management Studio?
Запусти как асинхронный вызов (например, асинхронный вызов делегата). При уничтожении вызывающего потока, согласно документации, должно прерваться и асинхронное задание. Т.е. создай вспомогательный поток, из него вызови нужный код асинхронно, и жди в этом потоке через Sleep завершения, проверяя заодно некий флаг принудительного выхода (для простого типа инхронизация доступа к флагу необязательна). Это позволит нормально завершить твой вспомогательный поток, Abort юзать настоятельно не рекомендуется.
Здравствуйте, vdimas, Вы писали:
V>Запусти как асинхронный вызов (например, асинхронный вызов делегата). При уничтожении вызывающего потока, согласно документации, должно прерваться и асинхронное задание. Т.е. создай вспомогательный поток, из него вызови нужный код асинхронно, и жди в этом потоке через Sleep завершения, проверяя заодно некий флаг принудительного выхода (для простого типа инхронизация доступа к флагу необязательна). Это позволит нормально завершить твой вспомогательный поток, Abort юзать настоятельно не рекомендуется.
Попробовал, не помогло. После входа в медот Open поток никаким образом прервать не удается. Выход один — прерывать поток не из основного потока (GUI), а в отдельном специально созданном для этого, например способом вызова асинхронного делегата.
Здравствуйте, SelfCoder, Вы писали:
SC>Здравствуйте, vdimas, Вы писали:
V>>Запусти как асинхронный вызов (например, асинхронный вызов делегата). При уничтожении вызывающего потока, согласно документации, должно прерваться и асинхронное задание. Т.е. создай вспомогательный поток, из него вызови нужный код асинхронно, и жди в этом потоке через Sleep завершения, проверяя заодно некий флаг принудительного выхода (для простого типа инхронизация доступа к флагу необязательна). Это позволит нормально завершить твой вспомогательный поток, Abort юзать настоятельно не рекомендуется.
SC>Попробовал, не помогло. После входа в медот Open поток никаким образом прервать не удается. Выход один — прерывать поток не из основного потока (GUI), а в отдельном специально созданном для этого, например способом вызова асинхронного делегата.
Попробуй заменить [STAThread] на [MTAThread] и запускать коннект в дополнительном потоке. Либо ройся в области многопоточности COM-объектов.