2012-05-19 14 views
13

Qualcuno può darmi un vantaggio sull'argomento del threading? Penso di sapere come fare alcune cose, ma ho bisogno di sapere come fare quanto segue:Filettatura C# - Come avviare e interrompere una discussione

Impostare un thread principale che rimarrà attivo fino a quando non lo segnale di interromperlo (nel caso ve lo chiediate, terminerà quando i dati è ricevuto). Quindi voglio iniziare un secondo thread che acquisisca i dati da una casella di testo e dovrebbe uscire quando lo segnali a quello di cui si verifica quando l'utente preme il tasto Invio.

Cheers!

+0

basta usare un ciclo mentre dall'altro filo finché esso non riceve dati –

+0

Iniziare un filo è molto semplice. Fermare uno è incredibilmente difficile. Concentrati sull'arresto. –

+1

Si potrebbe esaminare usando un BackgroundWorker. Dispone di callback di eventi thread-safe che sono molto utili se è necessario manipolare i componenti di form/control. – climbage

risposta

16

Questo è come lo faccio ...

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... 
    } 
} 

Poi per eseguire questo nel proprio thread ... (io lo faccio in questo modo perché voglio anche inviare args al filo)

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

Il filo viene creato chiamando "FireThread()"

Il filo appena creato verrà eseguito fino alla sua condizione di s top è soddisfatta, allora muore ...

È possibile segnalare la "principale" con i delegati, a dire che quando il filo è morto .. in modo da poter poi avviare la seconda ...

migliore per leggere: This MSDN Article

+0

Si noti che questo approccio crea l'opportunità per un massimo di un secondo di ritardo tra le cose da mostrare e fare effettivamente le cose. Non necessariamente male, dipende dalle tue esigenze. Attualmente sto cercando su Google come utilizzare al meglio un thread di background worker usando EventWaitHandle per la segnalazione cross-process/thread, ma poi ho la fortuna di avere il controllo su entrambi i processi (il generatore di roba e roba del genere). Questo dovrebbe eliminare qualsiasi ritardo di polling. –

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

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

Penso che 'Abort()' dovrebbe essere una chiamata di ultima istanza. Sarebbe meglio impostare una bandiera e fermare il thread con grazia. – climbage

+9

-1: Mi dispiace, ma 'Thread.Abort' è quasi il modo per farlo. Un ciclo con un 'ManualResetEvent' - o anche una bandiera booleana volatile - sarebbe un approccio più sicuro. – Douglas

4

Utilizzare un AutoResetEvent statico nei thread spawn per richiamare il thread principale utilizzando il metodo Set(). Questo ragazzo ha una demo abbastanza buona in SO su come usarlo.

AutoResetEvent clarification

Problemi correlati