TPL Как выполнить «обратный вызов»

У меня есть небольшое приложение, которое должно тестировать строки подключения SQL для нескольких подключений (каждое выполняется по одному). Для этого я временно установил ConnectionTimeout = 5, чтобы избежать длительного ожидания, если соединение недействительно, и ConnectionTimeout = 0(скажем, ждать вечно).

Во избежание зависания пользовательского интерфейса при попытке Open()плохое соединение (даже при ConnectionTimeout = 5ожидание SqlExceptionможет увеличиться. до двадцати секунд), я хочу запустить тест в отдельном потоке, используя библиотеку параллельных задач (TPL). Итак, я выделяю свой новый поток следующим образом:

Task<bool> asyncTestConn = Task.Factory.StartNew<bool>
    (() => TestConnection(conn, bShowErrMsg));
return asyncTestConn.Result;

Проблема в том, что он по-прежнему блокирует пользовательский интерфейс (очевидно), так как он ожидает результата, прежде чем вернуться к вызывающей стороне.Как разрешить коду возвращать управление пользовательскому интерфейсу (освобождая графический интерфейс) при получении конечного результата от асинхронной задачи ?

Кроме того, внутри Taskя могу законно выполнить MessageBox.Show("Some message")? Это не работает для BackgroundWorkers, и этот объединенный поток является фоновым потоком по умолчанию; но это не кажется проблемой. Спасибо за ваше время.

5
задан MoonKnight 8 March 2012 в 12:10
поделиться