none
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 RRS feed

  • 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

    viernes, 26 de marzo de 2021 1:13

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
    viernes, 26 de marzo de 2021 7:42
    Moderador

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
    viernes, 26 de marzo de 2021 7:42
    Moderador
  • 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.

    viernes, 26 de marzo de 2021 14:01
    Moderador