aunque se basa en un problema concreto, esta consulta es sobre todo
para intentar aclararme un poco con los conceptos mencionados en el
asunto, pues mis desavenecias con la terminologia sobreentendida
parece no tener fin.
Me explico (o lo intento al menos)
he estado haciendo unas pruebas para cargar un treeview con el
contenido de directorios elegidos aleatoriamente en un cuadro de
dialogo, cargando a la vez los iconos correspondientes a cada
extension con unos codigos sacados del foro y que utilizan alguna API
inicialmente cargaba todo el contenido del directorio elegido
(archivos, carpetas, subcarpetas, archivos de estas, sub_subcarpetas,
etc, pero, aunque cargando solo los archivos sin los iconos, no
resultaba demasiado lento, al final he probado a ir cargando solo por
niveles segun se seleccione, es decir, cargar solo el contenido de las
carpetas/directorios visibles en el treeview y al abrir una nueva
carpeta ir cargando el contenido de las que va a quedar visibles, pero
sin cargar el contenido de los sucesivos subdirectorios hasta que no
se vayan abriendo sus sucesivos contenedores
bueno, todo esto lo he conseguido razonablemente bien, al menos en
apariencia.
el problema me surjio al intentar cargar el contenido de un directorio
muy grande, en este caso C:\.
aunque no me daba un error propiamente dicho, si acababa agotando el
tiempo de espera y me lanzaba este mensaje=>
---------------------------------------------------------------------------------
Se detectó ContextSwitchDeadlock
Message: El CLR no ha podido realizar la transición del contexto COM
0x1a1248 al contexto COM 0x1a13b8 durante 60 segundos. Es probable que
el subproceso que contiene el contexto o apartamento de destino esté
en espera sin proporcionar mensajes o que procese una operación de
ejecución muy larga que no proporcione mensajes Windows. Normalmente,
esta situación tiene un impacto negativo en el rendimiento y puede
hacer que la aplicación no responda o que acumule continuamente el uso
de la memoria. Para evitar este problema, todos los subprocesos de
apartamentos de un único subproceso (STA) deberían utilizar primitivos
de espera que proporcionen mensajes (como CoWaitForMultipleHandles) y
proporcionar mensajes regularmente durante operaciones de ejecución
largas.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
a) aunque de momento el problema parece haberse solucionado con
DoEvents, en ese momento intente buscar una solucion por la via
indicada en el mensaje pero no logre aclararme sobre que son los MDA
ni como utilizarlos
¿podriais explicarme un poco por encima en que consisten, o en su
defecto donde buscar informacion para novatos al respecto?
b) durante estas busquedas crei entender que el problema venia de la
utilizacion de 'codigo no administrado', y aunque supongo que tendra
que ver con las apis utilizadas para cargar los iconos (sacado del
foro y que va de maravilla, o eso me parece), tampoco acabo de
aclararme con este termino
¿por codigo no administrado se refiere a todo aquel que no esta basado
en las librerias de Net.Franmwork? o no tiene nada que ver con esto??
c) tres cuartas de lo mismo me ocurre con el termino 'subprocesos'
¿que se entiende por subproceso? ¿puede ser por ejemplo cuando desde
un procedimiento llamamos a otro?¿seria este 2º procedimiento un
subproceso? ¿o tampoco tiene nada que ver con esto?
bueno, como veis se trata de dudas mas bien genericas y posiblemente
dificiles de explicar con pocas palabras, pero cualquier comentario,
aclaracion o enlace sera bien recibido
un saludo
Ivan