He hecho 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?¿Cuál es la mejor manera de actualizar los controles de formulario de un hilo de trabajo?
Respuesta
Hay una regla general que dice que no actualice 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 sucede en un hilo diferente, debe hacer una "Invoke" o BeginInvoke para forzar al delegado a ejecutar el método en el hilo de la interfaz de usuario.
Edición: Jon B hizo este buen punto en los comentarios:
Tenga en cuenta que Invoke() es sincrónica y BeginInvoke() es asíncrona. Si usa Invoke(), debe tener cuidado de no causar un punto muerto . Recomendaría BeginInvoke() a menos que realmente necesite la llamada para que sea sincrónica.
Algunos sencillo código de ejemplo:
// 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 es de un FAQ sobre él here y una más larga más involucrado uno here.
¿Por qué no quieres hacerlo con 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.
También consideraría InvokeRequired (VS2008 solamente) al llamar a Invoke. Hay momentos en que no actualizará la UI desde un hilo separado. Se 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);
}
- 1. ¿Cuál es la mejor manera de borrar todos los controles en un formulario C#?
- 2. ¿Cuál es la mejor manera de actualizar los datos subyacentes de un adaptador?
- 3. ¿Cuál es la diferencia entre un hilo de trabajo CLR y un hilo de trabajo?
- 4. Cuál es la mejor manera de actualizar entidades en nhibernate
- 5. ¿Cuál es la mejor manera de rastrear los cambios en un formulario a través de javascript?
- 6. hilo de Java que es mejor manera?
- 7. ¿Cuál es la mejor manera de hacer que un hilo indique otro hilo en .NET?
- 8. ¿Cuál es la mejor manera de implementar controles de usuario en ASP.NET MVC?
- 9. ¿Cuál es la mejor manera de escribir en un archivo en un hilo paralelo en Java?
- 10. Cuál es la mejor manera de actualizar de Eclipse 3.3 a 3.4 (o versiones futuras)
- 11. ¿Cuál es la mejor manera de eliminar impulso :: hilo objeto justo después de su trabajo está completo?
- 12. ¿Cuál es la mejor manera de comunicarse entre los AppDomains?
- 13. ¿Cuál es la mejor manera de resaltar un campo obligatorio en un formulario web?
- 14. Al actualizar un Ensamblaje, ¿cuál es la mejor manera de migrar archivos en Almacenamiento aislado?
- 15. ¿Cuál es la mejor manera de cambiar el origen de un repositorio Git?
- 16. ¿Cuál es la mejor manera de barajar un NSMutableArray?
- 17. En Erlang, ¿cuál es la mejor manera de actualizar un sistema distribuido?
- 18. ¿Cuál es la mejor manera de vaciar un directorio?
- 19. ¿Cuál es la mejor manera de llamar a un método DESPUÉS de que se cargue un formulario?
- 20. ¿Cuál es la mejor manera de inicializar un frijol?
- 21. La mejor manera de actualizar/cargar UIScrollView
- 22. ¿Qué es un hilo de trabajo y su diferencia de un hilo que creo?
- 23. ¿La mejor manera de hacer un formulario modelo de búsqueda?
- 24. ¿Cuál es la mejor manera de actualizar de jquery 1.3 a 1.4?
- 25. ¿Cuál es la mejor manera de convencer a las personas para actualizar IE?
- 26. ¿Cuál es la mejor manera de determinar un bucle invariante?
- 27. ¿Cuál es la mejor manera de probar un procedimiento almacenado?
- 28. ¿Cuál es la mejor manera de implementar un "temporizador"?
- 29. ¿Cuál es la mejor manera de probar un RedirectToAction?
- 30. ¿Cuál es la mejor manera de probar el flujo de trabajo en Spring-Batch?
¿Qué hace exactamente el m_TextBox.Invoke? ¿Obliga al delegado a ejecutarse en el hilo de la interfaz de usuario? – Yttrium
Exactamente. 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. –
Buena llamada, Jon B. Debería haber mencionado eso. Voy a editar para reflejar el punto. –