Mam małą aplikację, która musi przetestować ciągi połączenia SQL dla wielu połączeń (każda wykonywana pojedynczo). Aby to zrobić, tymczasowo ustawiam ConnectionTimeout = 5
, aby uniknąć długiego oczekiwania, jeśli połączenie nie jest prawidłowe i, powiedzmy, ConnectionTimeout = 0
(czekać na zawsze).TPL Jak wykonać "oddzwonić"
Aby uniknąć wiszące UI podczas gdy staramy się Open()
złe połączenie (nawet z ConnectionTimeout = 5
czekać na SqlException
może wynosić do dwudziestu sekund), chcę, aby uruchomić test na osobnym wątku przy użyciu Task Parallel Library (TPL). Więc spin-off mój nowy wątek jak:
Task<bool> asyncTestConn = Task.Factory.StartNew<bool>
(() => TestConnection(conn, bShowErrMsg));
return asyncTestConn.Result;
Problemem jest to, że wciąż blokowania UI (wyraźnie), ponieważ czeka na wynik przed powrotem do rozmówcy. W jaki sposób mogę zezwolić, aby kod zwrócił kontrolę do interfejsu użytkownika (zwalniając GUI), jednocześnie uzyskując ostateczny wynik z asynchronicznego Task
?
Również z poziomu Task
mogę legalnie wykonywać MessageBox.Show("Some message")
? To nie działa dla BackgroundWorkers
, a ten połączony wątek jest domyślnie wątkiem tła; ale to nie wydaje się być problemem. Dziękuję za Twój czas.
Dziękuję bardzo za odpowiedź. Cała idea polega na powrocie do przekazania kontroli do interfejsu użytkownika/GUI tak szybko, jak to możliwe, w jaki sposób/może to osiągnąć? Jeśli wywołuję powyższy kod z metody o nazwie 'ParrTestConn (SqlConnection conn, string bShowErrMsg)', to nie mogę powiedzieć 'asyncTestConn.ContinueWith (ParrTestConn (conn, bShowErrMsg))' ... Czy mogę? – MoonKnight
@Killer Możesz po prostu powrócić po uruchomieniu(). Interfejs GUI powinien być responsywny podczas korzystania z tego. –
Nie mam metody 'Task.Factory.Create' avilible? –
MoonKnight