2012-05-19 15 views
13

Czy ktoś może mi dać przewagę na temat wątków? Myślę, że wiem, jak zrobić kilka rzeczy, ale muszę wiedzieć, jak wykonać następujące czynności:C# Gwintowanie - Jak uruchamiać i zatrzymywać wątek

Skonfiguruj główny wątek, który pozostanie aktywny, dopóki nie zasygnam go zatrzymać (na wypadek, gdyby się zastanawiałeś, zakończy się, gdy dane jest otrzymywany). Następnie chcę rozpocząć drugi wątek, który będzie przechwytywał dane z pola tekstowego i powinien zakończyć się, gdy zasygnalizuję to, co ma miejsce, gdy użytkownik naciśnie klawisz Enter.

Pozdrawiam!

+0

prostu użyć pętli while w innym wątku, dopóki nie otrzyma danych –

+0

Rozpoczynanie wątku jest bardzo łatwe. Powstrzymanie jednego jest niewiarygodnie trudne. Skoncentruj się na zatrzymaniu. –

+1

Możesz zajrzeć do korzystania z BackgroundWorker. Ma zwroty zdarzeń, które są bezpieczne dla wątków, co jest bardzo przydatne, jeśli potrzebujesz manipulować komponentami form/control. – climbage

Odpowiedz

16

To jak to zrobić ...

public class ThreadA { 
    public ThreadA(object[] args) { 
     ... 
    } 
    public void Run() { 
     while (true) { 
      Thread.sleep(1000); // wait 1 second for something to happen. 
      doStuff(); 
      if(conditionToExitReceived) // what im waiting for... 
       break; 
     } 
     //perform cleanup if there is any... 
    } 
} 

Następnie uruchomić to we własnym wątku ... (robię to w ten sposób, bo też chcą wysłać argumenty do wątku)

private void FireThread(){ 
    Thread thread = new Thread(new ThreadStart(this.startThread)); 
    thread.start(); 
} 
private void (startThread){ 
    new ThreadA(args).Run(); 
} 

wątek tworzony jest przez wywołanie „FireThread()”

nowo utworzony wątek będzie trwał aż do jego stanu do S Najwięcej jest spełniony, to umiera ...

można sygnalizować „głównym” z delegatów, aby poinformować go, gdy wątek umarł .. więc można wtedy uruchomić drugi ...

Najlepszy aby przeczytać: This MSDN Article

+0

Należy zauważyć, że to podejście stwarza okazję do sekundy opóźnienia między wyświetlaniem i wykonywaniem rzeczy. Niekoniecznie źle, zależy od Twoich wymagań. Obecnie szukam w serwisie Google informacji o tym, jak najlepiej wykorzystać wątek roboczy w tle za pomocą EventWaitHandle do sygnalizacji między procesami/wątkami, ale mam szczęście, że mam kontrolę nad obydwoma procesami (generatorem materiałów i robakiem). To powinno wyeliminować jakiekolwiek opóźnienie w odpytywaniu. –

5
Thread th = new Thread(function1); 
th.Start(); 
th.Abort(); 

void function1(){ 
//code here 
} 
+12

Myślę, że "Abort()" powinno być ostatecznością. Lepiej ustawić flagę i z wdziękiem zatrzymać wątek. – climbage

+9

-1: Przykro mi, ale "Thread.Abort' jest prawie __________ sposobem na zrobienie tego. Pętla z 'ManualResetEvent' - lub nawet zmienną flagą boolowską - byłaby bezpieczniejsza. – Douglas

4

Użyj statycznego AutoResetEvent w twoich spawnowanych wątkach, aby oddzwonić do głównego wątku, używając metody Set(). Ten gość ma dość dobre demo w SO na temat tego, jak go używać.

AutoResetEvent clarification