У меня есть небольшое приложение, которому необходимо проверить строки подключения SQL для нескольких подключений (каждое выполняется по одному). Для этого я временно установил ConnectionTimeout = 5
, чтобы избежать длительного ожидания, если соединение недействительно, и ConnectionTimeout = 0
(ожидание навсегда), скажем.
Чтобы избежать зависания пользовательского интерфейса, когда мы пытаемся Open()
установить плохое соединение (даже при ConnectionTimeout = 5
ожидание SqlException
может составлять до двадцати секунд), я хочу запустить тест в отдельном потоке с помощью библиотеки параллельных задач (TPL). Итак, я создаю свой новый поток, например:
Task<bool> asyncTestConn = Task.Factory.StartNew<bool>
(() => TestConnection(conn, bShowErrMsg));
return asyncTestConn.Result;
Проблема в том, что это по-прежнему блокирует пользовательский интерфейс (очевидно), поскольку он ожидает результата, прежде чем вернуться к вызывающей стороне. Как разрешить коду возвращать управление пользовательскому интерфейсу (освобождая графический интерфейс), получая конечный результат от асинхронного Task
?
Кроме того, из Task
могу ли я на законных основаниях сделать MessageBox.Show("Some message")
? Это не работает для BackgroundWorkers
, и этот объединенный поток по умолчанию является фоновым потоком; но это не кажется проблемой. Спасибо за ваше время.