Qual è il modo migliore per fare in modo che un thread segnali un altro thread in .NET?

StackOverflow https://stackoverflow.com/questions/115928

  •  02-07-2019
  •  | 
  •  

Domanda

Devo avere un segnale di thread un altro se l'utente desidera interrompere l'esecuzione, tuttavia non sono sicuro su come implementare il meccanismo di segnalazione / controllo del segnale. Non vorrei avere un singleton nel mio progetto (come un bool globale), ma esiste un'alternativa?

In questa discussione persone suggeriscono strutture adeguate per questo in C ++, ma non so nulla di simile in .NET. Qualcuno potrebbe far luce per favore?

È stato utile?

Soluzione

Prova BackgroundWorker . Supporta gli aggiornamenti di avanzamento e la cancellazione di un'attività in esecuzione.

Se vuoi che un thread attenda fino a quando un altro thread ha finito di fare le sue cose, allora Monitor.Wait e Monitor.Pulse sono buoni, come ManualResetEvent. Tuttavia, questi non sono realmente utili per annullare un'attività in esecuzione.

Se vuoi scrivere il tuo codice di annullamento, potresti avere un campo da qualche parte a cui entrambi i thread hanno accesso. Contrassegnalo come volatile, ad es .:

private volatile bool cancelling;

Chiedi al thread principale di impostarlo su true e chiedi al thread di lavoro di controllarlo periodicamente e di impostarlo su false al termine.

Questo non è in realtà paragonabile ad avere una 'variabile globale', poiché puoi ancora limitare l'ambito della variabile semaforo come privato a una classe.

Altri suggerimenti

Un po 'vago (poco tempo), ma guarda ManualResetEvent e AutoResetEvent . Potresti anche cercare Monitorare e bloccare la parola chiave.

Cerca in Monitor.Wait e Monitor.Pulse. Ecco un eccellente articolo sul threading in .Net (molto leggibile): http: //www.albahari .com / filettatura / part4.aspx

Una soluzione semplice, come un booleano statico sincronizzato, dovrebbe essere tutto ciò di cui hai bisogno rispetto a una soluzione basata su framework che potrebbe essere eccessiva per il tuo scenario. Se desideri ancora un framework, dai un'occhiata al parallel estensioni a .NET per idee.

Dipende dal tipo di sincronizzazione necessaria. Se vuoi essere in grado di eseguire il thread in un ciclo fino a quando non viene raggiunta una sorta di fine dell'esecuzione, tutto ciò che serve è una variabile bool statica. Se si desidera che un thread attenda che un altro thread raggiunga un punto in esecuzione, è possibile utilizzare WaitEvents (AutoResetEvent o ManualResetEvent). Se devi aspettare più waitHandles puoi usare WaitHandle.WaitAll o WaitHandle.WaitAny.

Guarda lo spazio dei nomi System.Runtime.Remoting.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top