Aplikacje wielowątkowe (C# i Visual Basic)

Z Visual Basic i C#, można napisać aplikacje służące do wykonywania wielu zadań jednocześnie.Zadania z potencjalnym gospodarstwa aż inne zadania mogą być wykonywane w osobnych wątkach proces znany jako wielowątkowość lub wolnych wątków.

Aplikacje korzystające z wielowątkowość są bardziej sprawnych danych wprowadzanych przez użytkownika, ponieważ interfejs użytkownika pozostaje aktywne zadania intensywnie wykorzystujących procesor wykonać na oddzielnych wątków.Multithreading jest również przydatne przy tworzeniu skalowalnych aplikacji, ponieważ wątki można dodać wzrostem obciążenia.

[!UWAGA]

Visual Studio 2010i Program .NET Framework 4 zwiększenia wsparcia dla programowania równoległego przez podanie nowej runtime, nowe klasy biblioteki typów i nowych narzędzi diagnostycznych.Aby uzyskać więcej informacji, zobacz Programowanie równoległe w .NET Framework.

Za pomocą składnika BackgroundWorker

Najbardziej niezawodnym sposobem utworzenia wielowątkowych aplikacji jest użycie BackgroundWorker składnika.Klasa ta zarządza oddzielnego wątku, przeznaczonego do przetworzenia metodą, określonym przez użytkownika.Na przykład, zobacz Wskazówki: wielowątkowość ze składnikiem BackgroundWorker (C# and Visual Basic).

Aby rozpocząć operację w tle, należy utworzyć BackgroundWorker i nasłuchiwania zdarzeń, które sprawozdanie z postępów operacji i sygnału, po zakończeniu operacji.Można utworzyć BackgroundWorker obiektu programowo lub można przeciągać formularza z składników na karcie Przybornik.Jeśli tworzysz BackgroundWorker w Projektanta formularzy, pojawia się w Komponentów, a jego właściwości są wyświetlane w Właściwości okna.

Ustawienie dla operacji tła

Aby ustawić operacji tła, dodawanie obsługi zdarzenia DoWork zdarzenia.Wywołać czasochłonna operacja ta obsługa zdarzeń.

Aby rozpocząć operację, należy wywołać RunWorkerAsync.Aby otrzymywać powiadomienia o aktualizacjach postępu, uchwyt ProgressChanged zdarzenia.Aby otrzymać powiadomienie, gdy operacja została wykonana, uchwyt RunWorkerCompleted zdarzenia.

Metody, które obsługują ProgressChanged i RunWorkerCompleted zdarzeń można uzyskać dostęp do interfejsu użytkownika aplikacji, ponieważ te zdarzenia są wywoływane w wątku, który wywołał RunWorkerAsync metody.Jednakże DoWork programu obsługi zdarzeń nie można pracować z wszelkich obiektów interfejsu użytkownika, ponieważ jest uruchamiana w tle wątku.

Tworzenie i korzystanie z wątków

Aby uzyskać większą kontrolę nad zachowaniem wątków aplikacji, można zarządzać wątki samodzielnie.Jednakże okazuje się, że pisanie poprawne aplikacji wielowątkowych może być trudne: aplikacja może przestać odpowiadać lub doświadczenie przejściowego błędy spowodowane przez wyścigu.Aby uzyskać więcej informacji, zobacz Składniki obsługujące wielowątkowość.

Tworzenie nowego wątku przez zadeklarowanie zmiennej typu Thread i wywołaniem konstruktora, podanie nazwy procedury lub metodę, która ma być wykonana na nowy wątek.Poniższy kod zawiera przykład.

Dim newThread As New System.Threading.Thread(AddressOf AMethod)
System.Threading.Thread newThread =
    new System.Threading.Thread(AMethod);

Uruchamianie i zatrzymywanie wątków

Do rozpoczęcia realizacji nowego wątku, użyj Start metody, jak pokazano w poniższym kodzie.

newThread.Start()
newThread.Start();

Aby zatrzymać wykonywanie wątku, należy użyć Abort metody, jak pokazano w poniższym kodzie.

newThread.Abort()
newThread.Abort();

Oprócz uruchamiania i zatrzymywania wątków, można wstrzymać wątków, wywołując Sleep lub Suspend metody, wznowić wstrzymaną wątku za pomocą Resume metody i niszczenie wątku za pomocą Abort metody

Metody wątku

Poniższej tabeli przedstawiono niektóre metody, które można używać do kontrolowania poszczególnych wątków.

Metoda

Akcja

Start

Powoduje, że wątek rozpocząć uruchamianie.

Sleep

Wstrzymuje wątek przez określony czas.

Suspend

Wstrzymuje wątek, po osiągnięciu punktu bezpiecznego.

Abort

Zatrzymuje wątek, po osiągnięciu punktu bezpiecznego.

Resume

Ponownie uruchamia wstrzymaną wątku

Join

Powoduje, że bieżący wątek zaczekać na zakończenie innego wątku.Jeżeli używana wartość limitu czasu, Metoda ta zwraca True , jeśli wątek kończy się w alokowany czas.

Bezpieczne punkty

Większość z tych metod jest oczywiste, ale pojęcie bezpieczne punkty może być nowego użytkownika.Bezpieczne punkty są lokalizacje w kodzie, gdy jest on bezpieczny dla środowiska common language runtime do wykonywania automatycznych kolekcji garbage, proces zwalniania nieużywanych zmiennych i odzyskiwanie pamięci.Gdy wywołanie Abort lub Suspend metoda wątku, common language runtime analizuje kod i określa lokalizację odpowiednią lokalizację dla wątku zatrzymać wykonywanie.

Właściwości wątku

Wątki również zawierać kilka przydatnych właściwości, jak pokazano w poniższej tabeli:

Właściwość

Wartość

IsAlive

Zawiera wartość True , jeśli wątek jest aktywny.

IsBackground

Zwraca lub ustawia wartość Boolean wskazującą, jeśli wątek jest lub powinno być wątek tła.Wątki tła są takie jak wątki pierwszego planu, ale wątek tła nie zapobiega proces zatrzymywania.Po zatrzymaniu mają wszystkie wątki pierwszego planu, które należą do procesu, common language runtime kończy proces, wywołując Abort metoda wątków w tle, które są nadal aktywna.

Name

Pobiera lub ustawia nazwę wątku.Najczęściej używany do wykrywania poszczególnych wątków podczas debugowania.

Priority

Zwraca lub ustawia wartość, która jest używana przez system operacyjny do priorytetów, Planowanie wątków.

ApartmentState

Zwraca lub ustawia model wątka używany dla konkretnego wątku.Zmiany modelu wątkowości są ważne, gdy wątek wywołuje kod niezarządzany.

ThreadState

Zawiera wartość, która opisuje Państwa lub Państw dla wątku.

Priorytety wątków

Każdy wątek ma właściwość priorytet, która określa zajmowała plasterek czas procesora, należy wykonać.System operacyjny przydziela dłużej przedziały czasu, aby wątki o wysokim priorytecie i krótszy przedziały czasu wątków o niskim priorytecie.Nowe wątki są tworzone z wartością Normal, ale można zmienić Priority właściwość dowolną wartość w ThreadPriority wyliczania.

Zobacz ThreadPriority Aby uzyskać szczegółowy opis różnych priorytetów dla wątków.

Kolor pierwszego planu i tła wątków

A pierwszego planu wątku uruchamiane przez nieokreślony czas, należy wątek tła zatrzymuje tak szybko, jak zostało zatrzymane, ostatni wątek pierwszego planu.Można użyć IsBackground właściwość, aby określić lub zmienić stan wątku w tle.

Wielowątkowość z formularzy i formantów

Podczas gdy wielowątkowość najlepiej nadaje się do procedur i metod klasy, można również używany z formularzy i formantów.Jeśli tak zrobisz, należy pamiętać o następujących punktów:

  • W każdym przypadku, gdy jest to możliwe, wykonanie metody kontroli tylko w wątku, z którym został utworzony.Jeśli musi wywołać metodę formantu z innego wątku, należy użyć Invoke w wywołaniu metody.

  • Nie należy używać SyncLock (Visual Basic) lub lock (C#) oświadczenie wątków lock manipulujące formanty lub formularze.Ponieważ metody kontroli i formularzy czasami wywołania zwrotnego do wywołanie procedury, może zakończyć się przypadkowo Tworzenie zakleszczenia — sytuacja, w którym dwa wątki oczekiwania dla siebie zwolnić blokadę, powodując aplikacji powstrzymać.

Zobacz też

Informacje

Synchronizacja wątku (C# i Visual Basic)

Invoke

InvokeRequired

Thread

Koncepcje

Parametry i wartości zwracane dla procedur wielowątkowości (C# i Visual Basic)

Inne zasoby

Wielowątkowość w składnikach

JAK: Tworzenie wątku przy użyciu programu Visual C#