Carga de datos en segundo plano

14/11/2007 - 14:44 por Juan Diego Bueno | Informe spam
Buenos días:

Tengo un form con varios grids los cuales se rellenan desde SQL Server 2005
y sincronizados con un treeview. Puesto que la operación que más se demora
en ocasiones es la transferencia de registros de la BD, estaba pensando en
utilizar hilos o la clase backgroundworker, pero las primeras experiencias
no han sido buenas.

Digamos que la lógica que intento apartar en un hilo es ese fill que he
comentado, el cual tengo integrado en una clase. Generalmente lo que hago es
mandar a un método como parámetro una referencia a esa clase y ejecutar el
método de llenado.

Si uso la instrucción:
CheckForIllegalCrossThreadCalls = false;

puedo utilizar hilos o backgroundworker y funciona sin problemas, pero sólo
a simple vista, ya que debe entrar en conflicto con el dibujado del grid y
desaparece la barra vertical de desplazamiento. Si elimino esa instrucción,
no se produce la carga de los datos en el grid. Yo supongo que los tiros van
por usar una referencia dentro de la propia lógica del hilo, pero a priori
no veo otra forma.

¿Alguien me sabría decir una forma elegante y eficaz de resolver esta
situación?

Gracias

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
14/11/2007 - 22:05 | Informe spam
"Juan Diego Bueno" wrote in message
news:
Tengo un form con varios grids los cuales se rellenan desde SQL Server
2005 y sincronizados con un treeview. Puesto que la operación que más se
demora en ocasiones es la transferencia de registros de la BD, estaba
pensando en utilizar hilos o la clase backgroundworker, pero las primeras
experiencias no han sido buenas.

Digamos que la lógica que intento apartar en un hilo es ese fill que he
comentado, el cual tengo integrado en una clase. Generalmente lo que hago
es mandar a un método como parámetro una referencia a esa clase y ejecutar
el método de llenado.

Si uso la instrucción:
CheckForIllegalCrossThreadCalls = false;

puedo utilizar hilos o backgroundworker y funciona sin problemas, pero
sólo a simple vista, ya que debe entrar en conflicto con el dibujado del
grid y desaparece la barra vertical de desplazamiento. Si elimino esa
instrucción, no se produce la carga de los datos en el grid. Yo supongo
que los tiros van por usar una referencia dentro de la propia lógica del
hilo, pero a priori no veo otra forma.

¿Alguien me sabría decir una forma elegante y eficaz de resolver esta
situación?



Solo es lícito acceder a los objetos que hay en pantalla desde el mismo
hilo que los creó. Si lo intentas desde otro hilo, en principio te da un
error, y si desactivas el error poniendo CheckForIllegalCrossThreadCalls =
false entonce lo que ocurre es que se corrompen los controles en pantalla,
como ya has descubierto.

Por lo tanto, para hacer a carga desde otro hilo, ha que cargar los datos
sobre una estructura en memoria (que no sea un Control), y una vez que los
datos está en memoria, transferir la ejecución al hilo principal y desde
este hilo principal copiar los datos que están en memoria al Control que hay
en pantalla.

Esta transferencia de ejecución entre hilos se realiza mediante el método
Invoke del formulario (o de cualquier control), que es un método que sí que
admite ser llamado desde otro hilo. Se le pasa como argumento un delegado
que apunte a un método tuyo, el cual será invocado desde el hilo principal
cuando éste pueda (normalmente de forma casi instantánea). Dentro de ese
método es donde tienes que copiar los datos de memoria a pantalla.
Respuesta Responder a este mensaje
#2 Juan Diego Bueno
15/11/2007 - 06:42 | Informe spam
Muchas gracias Alberto

Saludos

Juan Diego Bueno www.moondance.tk

"Alberto Poblacion"
escribió en el mensaje news:%
"Juan Diego Bueno" wrote in message
news:
Tengo un form con varios grids los cuales se rellenan desde SQL Server
2005 y sincronizados con un treeview. Puesto que la operación que más se
demora en ocasiones es la transferencia de registros de la BD, estaba
pensando en utilizar hilos o la clase backgroundworker, pero las primeras
experiencias no han sido buenas.

Digamos que la lógica que intento apartar en un hilo es ese fill que he
comentado, el cual tengo integrado en una clase. Generalmente lo que hago
es mandar a un método como parámetro una referencia a esa clase y
ejecutar el método de llenado.

Si uso la instrucción:
CheckForIllegalCrossThreadCalls = false;

puedo utilizar hilos o backgroundworker y funciona sin problemas, pero
sólo a simple vista, ya que debe entrar en conflicto con el dibujado del
grid y desaparece la barra vertical de desplazamiento. Si elimino esa
instrucción, no se produce la carga de los datos en el grid. Yo supongo
que los tiros van por usar una referencia dentro de la propia lógica del
hilo, pero a priori no veo otra forma.

¿Alguien me sabría decir una forma elegante y eficaz de resolver esta
situación?



Solo es lícito acceder a los objetos que hay en pantalla desde el mismo
hilo que los creó. Si lo intentas desde otro hilo, en principio te da un
error, y si desactivas el error poniendo CheckForIllegalCrossThreadCalls =
false entonce lo que ocurre es que se corrompen los controles en pantalla,
como ya has descubierto.

Por lo tanto, para hacer a carga desde otro hilo, ha que cargar los
datos sobre una estructura en memoria (que no sea un Control), y una vez
que los datos está en memoria, transferir la ejecución al hilo principal y
desde este hilo principal copiar los datos que están en memoria al Control
que hay en pantalla.

Esta transferencia de ejecución entre hilos se realiza mediante el
método Invoke del formulario (o de cualquier control), que es un método
que sí que admite ser llamado desde otro hilo. Se le pasa como argumento
un delegado que apunte a un método tuyo, el cual será invocado desde el
hilo principal cuando éste pueda (normalmente de forma casi instantánea).
Dentro de ese método es donde tienes que copiar los datos de memoria a
pantalla.


Respuesta Responder a este mensaje
#3 Javier Lozano
17/11/2007 - 21:52 | Informe spam
Esto podria ayudarte


http://www.csharphelp.com/archives4...ve640.html

Saludos

Javier Lozano
Lima-Peru
"Juan Diego Bueno" wrote in message
news:
Buenos días:

Tengo un form con varios grids los cuales se rellenan desde SQL Server
2005 y sincronizados con un treeview. Puesto que la operación que más se
demora en ocasiones es la transferencia de registros de la BD, estaba
pensando en utilizar hilos o la clase backgroundworker, pero las primeras
experiencias no han sido buenas.

Digamos que la lógica que intento apartar en un hilo es ese fill que he
comentado, el cual tengo integrado en una clase. Generalmente lo que hago
es mandar a un método como parámetro una referencia a esa clase y ejecutar
el método de llenado.

Si uso la instrucción:
CheckForIllegalCrossThreadCalls = false;

puedo utilizar hilos o backgroundworker y funciona sin problemas, pero
sólo a simple vista, ya que debe entrar en conflicto con el dibujado del
grid y desaparece la barra vertical de desplazamiento. Si elimino esa
instrucción, no se produce la carga de los datos en el grid. Yo supongo
que los tiros van por usar una referencia dentro de la propia lógica del
hilo, pero a priori no veo otra forma.

¿Alguien me sabría decir una forma elegante y eficaz de resolver esta
situación?

Gracias


Respuesta Responder a este mensaje
#4 Juan Diego Bueno
17/11/2007 - 22:51 | Informe spam
Gracias Javier, es muy similar a lo que finalmente he hecho y ha funcionado
perfectamente.

Saludos

Juan Diego Bueno www.moondance.tk
"Javier Lozano" escribió en el mensaje
news:
Esto podria ayudarte


http://www.csharphelp.com/archives4...ve640.html

Saludos

Javier Lozano
Lima-Peru
"Juan Diego Bueno" wrote in message
news:
Buenos días:

Tengo un form con varios grids los cuales se rellenan desde SQL Server
2005 y sincronizados con un treeview. Puesto que la operación que más se
demora en ocasiones es la transferencia de registros de la BD, estaba
pensando en utilizar hilos o la clase backgroundworker, pero las primeras
experiencias no han sido buenas.

Digamos que la lógica que intento apartar en un hilo es ese fill que he
comentado, el cual tengo integrado en una clase. Generalmente lo que hago
es mandar a un método como parámetro una referencia a esa clase y
ejecutar el método de llenado.

Si uso la instrucción:
CheckForIllegalCrossThreadCalls = false;

puedo utilizar hilos o backgroundworker y funciona sin problemas, pero
sólo a simple vista, ya que debe entrar en conflicto con el dibujado del
grid y desaparece la barra vertical de desplazamiento. Si elimino esa
instrucción, no se produce la carga de los datos en el grid. Yo supongo
que los tiros van por usar una referencia dentro de la propia lógica del
hilo, pero a priori no veo otra forma.

¿Alguien me sabría decir una forma elegante y eficaz de resolver esta
situación?

Gracias






email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida