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
 

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.

Preguntas similares