Principales respuestas
Buenas. Tengo un Form1 que llama a un Form2, pero este Form2 tiene en el Load() varios metodos que demoran un poco y quisiera en lo que se cargan mostrar una pantalla loading con un gif. El problema es que no lo logro. Tienen alguna idea

Pregunta
-
Buenas. Tengo un Form1 que llama a un Form2, pero este Form2 tiene en el Load() varios metodos que demoran un poco y quisiera en lo que se cargan mostrar una pantalla loading con un gif. El problema es que no lo logro. Tienen alguna idea
En esos metodos trabajo con base de datos para cargar grid y ademas trabajo directamente con el grid y me lanza este error
An exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll but was not handled in user code
Additional information: Operación no válida a través de subprocesos: Se tuvo acceso al control '' desde un subproceso distinto a aquel en que lo creó.!!!!!!!AYUDAAAAAAA
Respuestas
-
Te puedo explicar la razón por la que te sale el error que estás viendo.
En algún sitio has metido una ejecución en multihilo. Puede que hayas usado un Task, o un Thread, o un BackgroundWorker, pero en cualquier caso has lanzado otro hilo de ejecución.
Pues bien, en una aplicación de escritorio no está permitido que la pantalla se manipule desde ningún otro hilo distinto del que la creó. Puedes usar un hilo para ejecutar consultas a base de datos y traer el resultado a variables en memoria. Pero no puedes mostrar esas variables en pantalla desde ese nuevo hilo. Si lo haces, sale un error como el que estás teniendo.
Para evitar el error, primero se ejecutan en el thread todas las operaciones, dejando el resultado en variables. Por ejemplo, puedes ejecutar una sentencia SQL y dejar el resultado en un DataTable. A continuación, trasvasas la ejecución al hilo principal. Esto se hace llamando al método Invoke de cualquier control, incluido el propio formulario. Al método Invoke se le pasa un delegado que señala las operaciones que quieres ejecutar en el hilo principal. Y en esas operaciones, tomas la variable en la que dejaste los datos y los presentas en pantalla. De esa forma se evita el error.
- Marcado como respuesta ruben97 viernes, 26 de marzo de 2021 13:49
Todas las respuestas
-
Te puedo explicar la razón por la que te sale el error que estás viendo.
En algún sitio has metido una ejecución en multihilo. Puede que hayas usado un Task, o un Thread, o un BackgroundWorker, pero en cualquier caso has lanzado otro hilo de ejecución.
Pues bien, en una aplicación de escritorio no está permitido que la pantalla se manipule desde ningún otro hilo distinto del que la creó. Puedes usar un hilo para ejecutar consultas a base de datos y traer el resultado a variables en memoria. Pero no puedes mostrar esas variables en pantalla desde ese nuevo hilo. Si lo haces, sale un error como el que estás teniendo.
Para evitar el error, primero se ejecutan en el thread todas las operaciones, dejando el resultado en variables. Por ejemplo, puedes ejecutar una sentencia SQL y dejar el resultado en un DataTable. A continuación, trasvasas la ejecución al hilo principal. Esto se hace llamando al método Invoke de cualquier control, incluido el propio formulario. Al método Invoke se le pasa un delegado que señala las operaciones que quieres ejecutar en el hilo principal. Y en esas operaciones, tomas la variable en la que dejaste los datos y los presentas en pantalla. De esa forma se evita el error.
- Marcado como respuesta ruben97 viernes, 26 de marzo de 2021 13:49
-
Hola Ruben,
¿Alguna novedad sobre la consulta realizada?
Gracias por usar los foros de MSDN.
Eric Ruiz
____________________________
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.