Tengo un escenario (Windows Forms, C #, .NET)
- Hay un formulario principal que aloja algún control de usuario.
- El control de usuario realiza una operación de datos pesados, de modo que si llamo directamente al
UserControl_Load
método, la interfaz de usuario deja de responder durante la ejecución del método de carga. - Para superar esto, cargo datos en diferentes hilos (tratando de cambiar el código existente lo menos que puedo)
- Utilicé un subproceso de trabajo en segundo plano que cargará los datos y cuando termine notificará a la aplicación que ha realizado su trabajo.
- Ahora vino un verdadero problema. Toda la interfaz de usuario (formulario principal y sus controles de usuario secundarios) se creó en el subproceso principal principal. En el método LOAD del control de usuario, estoy obteniendo datos basados en los valores de algún control (como el cuadro de texto) en userControl.
El pseudocódigo se vería así:
CÓDIGO 1
UserContrl1_LoadDataMethod()
{
if (textbox1.text == "MyName") // This gives exception
{
//Load data corresponding to "MyName".
//Populate a globale variable List<string> which will be binded to grid at some later stage.
}
}
La excepción que dio fue
Operación de subprocesos no válida: control al que se accede desde un subproceso distinto del subproceso en el que se creó.
Para saber más sobre esto, busqué en Google y surgió una sugerencia como usar el siguiente código
CÓDIGO 2
UserContrl1_LoadDataMethod()
{
if (InvokeRequired) // Line #1
{
this.Invoke(new MethodInvoker(UserContrl1_LoadDataMethod));
return;
}
if (textbox1.text == "MyName") // Now it wont give an exception
{
//Load data correspondin to "MyName"
//Populate a globale variable List<string> which will be binded to grid at some later stage
}
}
PERO PERO PERO ... parece que he vuelto al punto de partida. La aplicación vuelve a dejar de responder. Parece ser debido a la ejecución de la línea # 1 si la condición. La tarea de carga se realiza nuevamente por el subproceso principal y no por el tercero que generé.
No sé si percibí esto bien o mal. Soy nuevo en el enhebrado.
¿Cómo resuelvo esto y también cuál es el efecto de la ejecución de la Línea # 1 si se bloquea?
La situación es la siguiente : quiero cargar datos en una variable global basada en el valor de un control. No quiero cambiar el valor de un control desde el hilo secundario. Nunca lo haré desde un hilo secundario.
Por lo tanto, solo acceda al valor para que los datos correspondientes se puedan obtener de la base de datos.