Zakonczenie watku w ThreadPool

Zakonczenie watku w ThreadPool
US
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 95
0

Dzien dobry,
Mam problem z wykryciem zakonczenia watku ThreadPool. Jak uzyje Wait(), to watek mi sie zawiesza.
Ponizej kod:

Kopiuj
        public void PingServer()
        {
           _LogMsg(_ExtDiag, "start");
             var  t = Task.Run((Action)(() =>
            {
                try
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_URI);
                    WebResponse response = request.GetResponse();
                    _LogMsg(_ExtDiag, "Web Service status: " + ((HttpWebResponse)response).StatusDescription);
                    _SetConnection(true);
                    response.Close();
                }
                catch (Exception ex)
                {
                    _LogMsg(_ExtDiag, "Web Service status: Service not avalaible " + ex.Message);
                    _SetConnection(false);
                }
                finally { _LogMsg(_ExtDiag, "End try/catch/finally"); }
            }));
            t.Wait();
            _LogMsg(_ExtDiag, "End ");
     }

Jak wywale t.Wait() wszystko chyba dziala poprawnie (chyba, bo nie jestem pewien czy watek sie konczy). w logu (_LogMsg) dostaje nastepujece komunikaty:

3/7/2019 8:55:03 AM:323 | WEB : start
3/7/2019 8:55:03 AM:323 | WEB : End
3/7/2019 8:55:04 AM:118 | WEB : Web Service status: OK
3/7/2019 8:55:04 AM:134 | WEB : End try/catch/finally

Jak t.Wait() istnieje, watek I program sie wiesza, w logu jest tylko "start" ;(
3/7/2019 8:56:12 AM:612 | WEB : start

Problem odkrylem przez przypadek, poniewaz chcialem wywolac

Kopiuj
NotifyPropertyChanged("Connected");

po zakonczeniu watku, ale o tym moze pozniej w osobnym watku

AF
  • Rejestracja: dni
  • Ostatnio: dni
1

To jakiś WPF czy aplikacja okienkowa, a PingServer jest wołane z wątku UI? Jeżeli tak, to wołanie t.Wait() blokuje wątek UI, jeżeli cokolwiek będzie chciało zmodyfikować widok, to będzie deadlock. Nie rób tego, od takich rzeczy jest async/await.

US
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 95
0
Afish napisał(a):

To jakiś WPF czy aplikacja okienkowa, a PingServer jest wołane z wątku UI? Jeżeli tak, to wołanie t.Wait() blokuje wątek UI, jeżeli cokolwiek będzie chciało zmodyfikować widok, to będzie deadlock. Nie rób tego, od takich rzeczy jest async/await.

Zmienilem na await I dziala tak jak chcialem. Dzieki.
Jak pisalem problem wyszedl niejako przy okazji. Abstrahujac od zawieszenia UI, pozostaje pytanie dlaczego watek sie nie wykonywal jak bylo t.Wait()?

neves
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1114
0

A co masz w tym _LogMsg ? Podejrzewam że przy pierwszym wywołaniu _LogMsg w wątku właśnie dochodzi do deadlocka.

US
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 95
0
neves napisał(a):

A co masz w tym _LogMsg ? Podejrzewam że przy pierwszym wywołaniu _LogMsg w wątku właśnie dochodzi do deadlocka.

To jest logger ktory wyswietla komunikaty w UI I zapisuje je do pliku. Jak nie ma Wait to dostaje wszystkie komunikaty, wiec chyba sie nie wiesza na pierwszym.

PS. Masz racje, Jak wywalilem logera z watka to dzial. Tylko dalej nie wiem dlaczego sie wiesza ;(

AF
  • Rejestracja: dni
  • Ostatnio: dni
1

UI można modyfikować tylko z jednego wątku, jak go zablokujesz, to wszystko chcące zmieniać widoki musi czekać. Poczytaj o synchronization context.

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
1

bo t.Wait(); w głównym wątku blokuje go aż do końca wątku pobocznego. Teraz jeśli z wątku pobocznego chcesz zrobić coś w wątku głównym (który jest zablokowany przez t.Wait();) to masz deadlocka

US
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 95
0

Afish I abracadaber wyjsnili wystarczajaco dobrze przyczyny problemu.
t.Wait() blokowalo watek w UI, a w tym czasie _LogMsg czekal na odblokowanie watku, zeby zapisac message.
async/await rozwiazalo problem
Dzieki za pomoc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.