2012-03-06 14 views
6

Sto utilizzando C# .Net4.0 in VS 2010. Come riavviare un Thread?Come riavviare una discussione in C# .Net 4.0?

È come se volessi Abort() il thread e Start() dall'inizio ancora? È possibile?

+1

In generale, 'Abort()' inserire un thread è una cattiva idea. Che problema vuoi risolvere? – Heinzi

+0

Questo potrebbe aiutare a: - [Il riavvio di un filo in C# 4.0] [1] [1]: http://stackoverflow.com/questions/1054889/restarting-a-thread-in-net- using-c – Misam

+0

Il requisito per fermare e avviare il thread è un po 'insolito - qual è il problema che stai cercando di risolvere? – dice

risposta

7

creare una nuova istanza di thread ed eseguire nuovamente. thread1 = new Thread(); thread1.start();

7

Interrompere una discussione è spesso una cattiva idea. Lui è un consulente. Se è un ciclo infinito, un booleano ha usato per fermare il thread senza l'aborto.

bool run = true; 
Thread thread = new Thread(method); 
thread.start(); 

private void method() 
{ 
    while(run) 
    { 

    } 
} 

Per interrompere il thread, è sufficiente impostare il valore booleano su false e, in genere, è possibile riavviarlo in un secondo momento.

+1

Buon consiglio. 'run' dovrebbe essere' volatile' per evitare l'attesa indefinita a causa delle ottimizzazioni del compilatore. – Tudor

+1

Considerare l'uso di 'lock', specialmente quando si imposta il valore booleano. Ancora meglio, usandolo in combinazione con 'monitor'. Dai un'occhiata qui: http://stackoverflow.com/questions/1559293/c-sharp-monitor-wait-pulse-pulseall#1559662 –

+0

La funzione thread inizia quando clicco per creare il server. Esegue alcune inizializzazioni e quindi entra in un ciclo infinito contenente socket.Accept().Il controllo si blocca su questa affermazione, quindi non posso usare questo metodo di blocco. – Shashwat

2

Thread.Abort non garantisce che il thread terminerà. Ad esempio, se si dispone di una query a esecuzione prolungata, Abort non interromperà l'esecuzione della query o la cancellazione della discussione. In effetti, la discussione continuerà fino a quando la query non sarà completata.

Se si sta eseguendo tutto nel codice gestito e non viene bloccato da risorse non gestite e si deve interrompere una discussione, thread.Abort() è perfettamente a posto.

Tuttavia, non è possibile chiamare Start su un thread che è stato terminato. Dovrai creare un altro thread e chiamare Start su quel thread. La creazione di thread è alquanto costosa, in termini di memoria, in .NET (rispetto ad altri linguaggi), quindi ci sono alcuni inconvenienti.

+0

In realtà la creazione del thread ancora e ancora non sarà troppo costosa in quanto non verrà eseguita molto frequentemente. – Shashwat

1

Quando si desidera riavviare il thread dall'inizio, in realtà si desidera riavviare un'esecuzione di una determinata funzione (flusso di codice) sul thread. Quando si crea un thread e si passa una funzione per l'esecuzione, la vita di un thread verrà interrotta non appena la funzione termina la propria esecuzione. Hai solo bisogno di cambiare la progettazione del codice che permetterà di riavviare la funzione con la ricreazione di un nuovo thread. Ma per le funzioni brevi, consiglierei di usare ThreadPool.

1

Poiché si utilizza .NET 4.0, in cui MS ha introdotto il "Cooperative Cancellation Framework". Puoi leggere altro da questo blog. Affrontare direttamente con Thread è (sempre più) scoraggiato.