Uso una scrittura di thread in un'altra classe per aggiornare un'etichetta. L'etichetta è contenuta nella classe principale di Winform.Aggiorna etichetta da un'altra filettatura
Scanner scanner = new Scanner(ref lblCont);
scanner.ListaFile = this.listFiles;
Thread trd = new Thread(new ThreadStart(scanner.automaticScanner));
trd.IsBackground = true;
trd.Start();
while (!trd.IsAlive) ;
trd.Join();
Come potete vedere, ho passato il riferimento dell'etichetta nel costruttore della seconda classe. Nella seconda classe (Scanner) ho un metodo chiamato "automaticScanner" che dovrebbe aggiornare l'etichetta con questo codice:
public Scanner(ref ToolStripStatusLabel _lblContatore)
{
lblCounter= _lblContatore;
}
Thread threadUpdateCounter = new Thread(new ThreadStart(this.UpdateCounter));
threadUpdateCounter.IsBackground = true;
threadUpdateCounter.Start();
while (!threadUpdateCounter .IsAlive) ;
threadUpdateCounter.Join();
private void AggiornaContatore()
{
this.lblCounter.Text = this.index.ToString();
}
Ho ricevere questo errore aggiornamento dell'etichetta:
Operazione cross-thread non valida: controllo 'Main' a cui si accede da un thread diverso dal thread creato su
Io uso .net 4 con Winform C#.
Grazie mille per le risposte.
Notizie: Il problema è questa linea:
trd.Join();
Questa linea di bloccare la mia GUI e l'etichetta non è stato aggiornato. Esistono metodi per controllare la fine del thread e aggiornare l'etichetta fino alla fine? Grazie
ma ... la sua corretta chiamata il filo in questo modo? Thread trd = new Thread (new ThreadStart (scanner.scansioneAutomatica)); trd.IsBackground = true; trd.Start(); while (! Trd.IsAlive); trd.Join(); In questa modalità la GUI è bloccata! : S – Antonio
Includi all'interno della classe il codice Azione y; e la funzione di attendere l'evento scaduto del timer vuoto privato T_Elapsed (oggetto mittente, System.Timers.ElapsedEventArgs e) { C++; // delegato è l'espressione "y =() => label1.Text = c.ToString()" label1.Invoke (y =() => label1.Testo = c.ToString()); } –