Saluti, Sto sviluppando alcune applicazioni in C#. Al momento ho a che fare con il threading e ho una domanda che ho in mente. Qual è la differenza tra Invoke e BeginInvoke? Ho letto alcune filo e ho trovato qui alcune informazioni utili: hereInvoke e BeginInvoke
Tuttavia ciò che è la differenza tra Invoke e BeginInvoke nel codice seguente:
private void ProcessRoutine()
{
for (int nValue = StartFrom; nValue <= EndTo; nValue++)
{
this.Invoke(this.MyDelegate, nValue);
//this.BeginInvoke(this.MyDelegate, nValue);
}
MessageBox.Show("Counting complete!");
}
private void MessageHandler(int progress)
{
lblStatus.Text = lblStatus.Text = "Processing item: " + progress.ToString();
progressBar1.Value = progress;
}
dove MyDelegate è un riferimento alla funzione messageHandler.
Ho notato che l'utilizzo di BeginInvoke lblStatus.Text non è stato aggiornato dove l'utilizzo di Invoke aggiorna l'etichetta. Inoltre so che Invoke attende il completamento dell'esecuzione. Il caso più importante a cui sono interessato è il motivo per cui in questo caso c'è una differenza nell'aggiornamento del testo dell'etichetta.
Calling BeginInvoke non significa che non è eseguito l'interfaccia utente filo. Significa che è chiamato in modo asincrono sul thread associato a "this" che potrebbe essere il thread dell'interfaccia utente. –
quindi, se non è in un altro thread, come funziona allora? –
Da MSDN: "Esegue il delegato specificato in modo asincrono sul thread su cui è stato creato l'handle sottostante del controllo". Quindi, se viene chiamato dal thread dell'interfaccia utente, verrà inserito in una coda ed eseguito quando l'interfaccia utente lo inattiva. Quale sarà dopo il ritorno del metodo attualmente in esecuzione. –