una tuvo subproceso que para otro metodo llamó interfaz hilos false distinto diferente desde delegados creó control checkforillegalcrossthreadcalls aquel aplicación aplanó acceso acceder c# multithreading forms

c# - tuvo - ¿Cuál es la mejor manera de actualizar los controles de formulario de un hilo de trabajo?



metodo invoke c# (4)

Hice algunas investigaciones y realmente no puedo encontrar una forma preferida de actualizar los controles de formulario de un hilo de trabajo en C #. Sé sobre el componente BackgroundWorker, pero ¿cuál es la mejor manera de hacerlo sin usar el componente BackgroundWorker?


¿Por qué no quieres hacerlo usando BackgroundWorker? Tiene un fantástico evento de devolución de llamada llamado ProgressChanged que permite que el hilo de la interfaz de usuario conozca las actualizaciones, perfecto para actualizaciones de tipo de barra de progreso y similares.

enlace a los detalles


Hay una discusión relacionada con esto aquí y otra aquí .

Esencialmente, usas Invoke para lograrlo.

¡La mejor de las suertes!


Hay una regla general que dice que no actualices la UI de ningún hilo que no sea el propio de la interfaz de usuario. Usar las características de BackgroundWorker es una buena idea, pero no desea hacerlo y algo está sucediendo en un hilo diferente, debe hacer una "Invocación" o BeginInvoke para forzar al delegado a ejecutar el método en el hilo de la interfaz de usuario.

Editar: Jon B hizo este buen punto en los comentarios:

Tenga en cuenta que Invoke () es sincrónico y BeginInvoke () es asincrónico. Si usa Invoke (), debe tener cuidado de no provocar un punto muerto. Recomendaría BeginInvoke () a menos que realmente necesite que la llamada sea sincrónica.

Un código de ejemplo simple:

// Updates the textbox text. private void UpdateText(string text) { // Set the textbox text. m_TextBox.Text = text; } public delegate void UpdateTextCallback(string text); // Then from your thread you can call this... m_TextBox.Invoke(new UpdateTextCallback(this.UpdateText), new object[]{"Text generated on non-UI thread."});

El código anterior proviene de una pregunta frecuente sobre este tema y uno más extenso aquí .


También consideraría InvokeRequired (VS2008 solamente) al llamar a Invoke. Hay momentos en que no actualizará la UI desde un hilo separado. Ahorra la sobrecarga de crear el delegado, etc.

if (InvokeRequired) { //This.Invoke added to circumvent cross threading exceptions. this.Invoke(new UpdateProgressBarHandler(UpdateProgressBar), new object[] { progressPercentage }); } else { UpdateProgressBar(progressPercentage); }