Główny wątek czeka na zakończenie innych wątków.

0

W klasie mam metodę, która tworzy 2 wątki(przykładowo) i pobiera stronę www, a następnie wyciąga z niej potrzebne dane i tak kilkaset razy.
Wynik na samym końcu jest zapisywany.



            Thread thread = new Thread(() =>
            {
               .............
                ............
            });         
            Thread thread2 = new Thread(() =>
            {
                ............
                   ...........
            });

            thread.Start();
            thread2.Start();

Jednak w takim wypadku główny wątek działa sobie dalej i kończy program.
Jak zrobić, aby czekał on, aż wykonają się inne wątki(dzieci)?

Próbowałem thread.Join(), jednak to blokowało thread2. Prowizorycznie zrobiłem

  while (!(thread.ThreadState == ThreadState.Stopped) && !(thread2.ThreadState == ThreadState.Stopped));  

jednak, gdy jeden wątek się zakończy, a drugi jeszcze działa to i tak program idzie dalej.

4
Michalk001 napisał(a):

jednak, gdy jeden wątek się zakończy, a drugi jeszcze działa to i tak program idzie dalej.

Bo tak zapisałeś warunek, w końcu żeby pętla działała to według warunku OBA wątki muszą być w innym stanie niż Stopped.

Proponuję jednak żebyś poczytał o metodach asynchronicznych. Pobieranie zawartości strony www to operacja IO, a przy takich lepiej korzystać z metod asynchronicznych zwracających Task niż tworzyć oddzielne wątki. Klasa HttpClient ma odpowiednie metody typu GetStringAsync(). Później robisz Task.WhenAll albo Task.WaitAll podając kolekcję tasków.

Prowizoryczny kod:

class SiteContent
{
    public string Url { get; set; }
    public string Content { get; set; }
}

...

var httpClient = new HttpClient();
var urls = new[] { "http://google.pl", "http://4programmers.net" };

List<Task<SiteContent>> tasks = urls
    .Select(async url => new SiteContent
    {
        Url = url,
        Content = await httpClient.GetStringAsync(url)
    }).ToList();

SiteContent[] results = await Task.WhenAll(tasks);

Przy dużej ilości stron pewnie warto byłoby dodać limitowanie liczby aktualnie działających Tasków. Zamiast czekać na zakończenie wszystkich Tasków można też czekać w pętli na pierwszy, który się zakończy (Task.WhenAny()) i wtedy zaczynać procesowanie tego konkretnego rezultatu.

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