Zakonczenie watku w ThreadPool

0

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

        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

NotifyPropertyChanged("Connected");

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

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.

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()?

0

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

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 ;(

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.

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

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0