Wprowadzenie do wątków

underTaker

Czym są wątki?

Zapewne wiele razy potrzebowaliście wykonywać wiele zadań na raz. Jak na przykład dzielenie czy mnożenie. Wykonując kilka takich operacji możemy pomyśleć, że wykonały się one na raz - nic dziwnego - wpisujemy kod w konsoli, a przy kompilacji widzimy od razu gotowy wynik. Co jednak, jeśli potrzebujemy wykonać setki czy tysiące takich operacji na raz? Interfejs naszego programu zablokuje się! Pada pytanie dlaczego? Program widzi instrukcje podane mu jako blok kodu, który musi zostać wykonany w całości dopóki nie napotka na jego koniec. Bardzo często jednak potrzebujemy wykonać takie "zasobożerne" operacje jednocześnie nie blokując interfejsu programu, lub wykonując inne tego typu operacje na raz. Tutaj z pomocą przychodzi nam wielowątkowość.

Jest to zagadnienie obsługiwane przez większość nowoczesnych języków programowania - w tym również C#. Wątek - thread umożliwia nam wykonanie dodatkowych operacji na raz. Obsługiwane jest to właśnie przez klasę Thread w przestrzeni nazw System.Threading. Ilość wątków teorytycznie jest nieograniczona - praktycznie ogranicza nas ilość zasobów sprzętowych. Każda aplikacja domyślnie posiada jeden wątek - wątek główny - czy to aplikacja konsolowa, czy okienkowa.

Wykonując dużą ilość operacji wątek, w którym są one wykonywane zostanie "zablokowany" - kod, który jest wykonywany musi zostać wykonany w całości (dopóki nie natrafimy na polecenie nakazujące zakończenie metody, lub na wyjątek). Możemy to łatwo sprawdzić:

for (int i = 0; i <= 10000; i++)
    Console.WriteLine("Iteracja #{0}", i);
Console.WriteLine("Koniec");

Po dziesięciotysięcznej iteracji zostanie wyświetlony napis "Koniec" - nie możemy w żaden sposób ingerować w program podczas wykonywania tej pętli. Podobnie sprawa ma się w aplikacjach okienkowych - wtedy jednak zostanie zablokowany interfejs programu - nie będziemy w stanie kliknąć w przycisk czy napisać cokolwiek w text boxie.

Takie operacje powinne być wykonane w osobnym wątku. Wątek taki możemy stworzyć w następujący sposób:

  • Po pierwsze tworzymy metodę, która będzie wykonywana w naszym wątku:
static void doSomething()
{
    for (int i = 0; i <= 10000; i++)
        Console.WriteLine("Iteracja z drugiego wątku!");
}
  • Po drugie tworzymy obiekt typu Thread i przekazujemy w parametrze naszą metodę i wywołujemy metodę Start.
Thread thr = new Thread(doSomething);
thr.Start();

for (int i = 0; i <= 10000; i++)
    Console.WriteLine("Iteracja #{0}", i);

Console.WriteLine("Koniec");

Jak widzimy teraz, podczas wykonania programu napis "Iteracja z drugiego wątku!" oraz "Iteracja #x" są z sobą przeplatane - wykonywane są w jednym czasie. Ma to duże zastosowanie w aplikacjach do obliczeń, w programach graficznych, albo w programach łączących się z internetem - do nasłuchiwania na dane z internetu. To oczywiście tylko niektóre zastosowania wątków. Więcej na ich temat w artykule Klasa Thread

2 komentarzy

puki co jest dobrze :)

Poprawcie to "puki" bo wali po oczach. Pozdro