none
Operacion no valida a traves de subprocesos RRS feed

  • Pregunta

  • Hola y buen dia, les comento que tengo una aplicacion cliente servidor, multihilos, donde el cliente realiza solicitudes de datos al servidor, donde el servidor ejecuta las sentencias en una BD SQL, pretendo cargar en este datagridview una consulta que he realizado a la BD, se las muestro a continuacion...

    Me surgio el siguiente error y lo solucione con esta linea de codigo:

    Control.CheckForIllegalCrossThreadCalls = False

    Pero cuando le doy clic a buscar ya no me muestra el error "operacion no valida a traves de subprocesos", y me muestra el siguiente error, por el cual he descidido plantear mi duda aqui...

    P.D: He leido varios temas relacionados pero no encuentro la solucion, les agradezco de antemano sus comentarios, estoy trabajando con Visual Studio Enterprise 2015 y .NET Framework 4.5

    lunes, 6 de junio de 2016 0:46

Respuestas

  • Me surgio el siguiente error y lo solucione con esta linea de codigo: Control.CheckForIllegalCrossThreadCalls = False

    Eso es un auténtico disparate. Jamás se debe desactivar el CheckForIllegalCrossThreadCalls. Precisamente sirve para protegerte y que te des cuenta cuando estás haciendo una operación prohibida, que consiste en llamar a los controles de la pantalla desde otro hilo distinto del que los creó. Eso no se puede hacer en Windows porque la pantalla es monohilo, es decir, sus estructuras internas no están protegidas para que no se corrompan si los datos se modifican desde otro hilo. Eso implica que, si los modificas desde otro hilo (y te deja hacerlo por haber puesto CheckForIllegalCrossThreadCalls=False), aunque aparente funcionar a primera vista, se te corromperán las estructuras internas de forma esporádica e impredecible, y tu programa fallará de vez en cuando sin que se sepa por qué está fallando. Por eso es un disparate poner Control.CheckForIllegalCrossThreadCalls = False, ya que causará fallos esporádicos e intermitentes.

    Si quieres llamar a la base de datos desde un hilo de background y luego pintar los resultados en la pantalla, lo que tiene que hacer el hilo de background es dejar los resultados de la consulta en una estructura en memoria (como por ejemplo un DataTable) y después trasladar la ejecución al hilo principal (usando Control.Invoke) y una vez en ese hilo principal (en la rutina a la que llamó el Invoke) entonces ya trasladas a la pantalla los datos que había en esa zona de memoria que se rellenó desde el hilo secundario.

    • Marcado como respuesta Armando Rodas lunes, 6 de junio de 2016 14:08
    lunes, 6 de junio de 2016 5:24

Todas las respuestas

  • Me surgio el siguiente error y lo solucione con esta linea de codigo: Control.CheckForIllegalCrossThreadCalls = False

    Eso es un auténtico disparate. Jamás se debe desactivar el CheckForIllegalCrossThreadCalls. Precisamente sirve para protegerte y que te des cuenta cuando estás haciendo una operación prohibida, que consiste en llamar a los controles de la pantalla desde otro hilo distinto del que los creó. Eso no se puede hacer en Windows porque la pantalla es monohilo, es decir, sus estructuras internas no están protegidas para que no se corrompan si los datos se modifican desde otro hilo. Eso implica que, si los modificas desde otro hilo (y te deja hacerlo por haber puesto CheckForIllegalCrossThreadCalls=False), aunque aparente funcionar a primera vista, se te corromperán las estructuras internas de forma esporádica e impredecible, y tu programa fallará de vez en cuando sin que se sepa por qué está fallando. Por eso es un disparate poner Control.CheckForIllegalCrossThreadCalls = False, ya que causará fallos esporádicos e intermitentes.

    Si quieres llamar a la base de datos desde un hilo de background y luego pintar los resultados en la pantalla, lo que tiene que hacer el hilo de background es dejar los resultados de la consulta en una estructura en memoria (como por ejemplo un DataTable) y después trasladar la ejecución al hilo principal (usando Control.Invoke) y una vez en ese hilo principal (en la rutina a la que llamó el Invoke) entonces ya trasladas a la pantalla los datos que había en esa zona de memoria que se rellenó desde el hilo secundario.

    • Marcado como respuesta Armando Rodas lunes, 6 de junio de 2016 14:08
    lunes, 6 de junio de 2016 5:24
  • Muchas Gracias, Alberto
    lunes, 6 de junio de 2016 14:09
  • Estimado algun ejemplo por favor

    Gracias,


    Conocuica

    viernes, 5 de abril de 2019 2:32
  • Viene un ejemplo en la propia documentación de Control.Invoke:

    https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.invoke?view=netframework-4.7.2

    Ahí verás cómo usa myFormControl1.Invoke(myFormControl1.myDelegate) para transferir la ejecución al hilo principal, donde presenta una serie de items en un listbox. La llamada la realiza desde un hilo, que en el caso del ejemplo no hace nada útil, pero si fuera un programa de verdad entonces dentro de ese hilo sería donde llamaría a base de datos para obtener los items que se presentan en el listbox (se cargarían en memoria antes de llamar a myFormControl1.Invoke y luego el método que los pinta los tomaría desde ahí).

    viernes, 5 de abril de 2019 6:31