Saludos, Estoy desarrollando alguna aplicación en C#. En este momento estoy tratando con el enhebrado y tengo una pregunta que tengo en mente. ¿Cuál es la diferencia entre Invoke y BeginInvoke? leí un poco de hilo y me encontré con algo de información útil aquí: hereInvocar y BeginInvoke
Sin embargo ¿cuál es la diferencia entre la invocación y BeginInvoke en el siguiente código:
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;
}
donde MyDelegate es una referencia a la función MessageHandler.
Me di cuenta de que el uso de BeginInvoke lblStatus.Text no se actualiza cuando el uso de Invoke refresca la etiqueta. Además, sé que Invoke espera a que se complete su ejecución. El caso más importante que me interesa es por qué hay una diferencia en el refrescante texto de la etiqueta en este caso.
Calling BeginInvoke no quiere decir que no se ejecuta en la interfaz de usuario hilo. Significa que se llama asincrónicamente en el hilo asociado con "this", que podría ser el hilo de UI. –
entonces si no está en otro hilo, ¿cómo funciona entonces? –
Desde MSDN: "Ejecuta el delegado especificado de forma asincrónica en el subproceso en el que se creó el identificador subyacente del control". Por lo tanto, si se llama desde el subproceso de interfaz de usuario, se colocará en una cola y se ejecutará cuando la interfaz de usuario lo ponga inactivo. Que será después de que el método actualmente en ejecución haya regresado. –