¿Dispose lento para usuarios restringidos?

16/04/2007 - 20:08 por Francisco J. Rodríguez | Informe spam
Hola. A ver si soy capaz de exponer bien la duda.

Tengo un formulario "A" que llama a otro "B". Si el resultado de "B" es
correcto (concretamente, si el valor de una de sus propiedades es true), se
cierra "B" y se abre otro "C". El método de "A" sería más o menos así:

private void MostrarFormulario()
{
FormularioB f = new FormularioB();
f.ShowDialog();
if (f.ValorAdecuado = true)
{
f.Dispose();
FormularioC fc = new FormularioC();
fc.ShowDialog();
fc.Dispose();
}
else
{
f.Dispose();
}
}

El problema es el siguiente: Si ejecuto esto desde Visual Studio y como
Administrador del PC, perfecto. Pero hago el instalador de la aplicación, la
instalo, creo un usuario restringido nuevo (en Windows XP Profesional) y
cuando inicio sesión con ese usuario nuevo y ejecuto el programa, tarda casi
dos minutos desde que se inicia el Dispose del formulario "B" hasta que
comienza el InitializeComponent del formulario "C" (también tarda al iniciar
la aplicación, y tarda siempre, no sólo la primera vez). Esto lo sé por la
traza que guardo en un log.

¿Alguien me puede orientar sobre lo que puede estar ocurriendo? Ya he
probado a otorgarle permisos al usuario restringido, restablecer las
directivas de seguridad de NET..., pero sin éxito. El formulario "B" es
sencillo, sólo tiene un par de textbox y un par de botones. No entiendo por
qué se produce ese retraso entre el Dispose de "B" y el InitializeComponent
de "C". Intuyo que tal vez tenga algo que ver con la configuración de NET o
con permisos, pero no estoy seguro.

Gracias, un saludo.
Francisco J. Rodríguez

Preguntas similare

Leer las respuestas

#1 Francisco J. Rodríguez
17/04/2007 - 16:21 | Informe spam
Me contesto yo mismo.

El retraso lo estaba produciendo una variable privada de tipo
OpenNETCF.Desktop.Communication.RAPI (utilizo esta librería en el proyecto).
Supuestamente, el retraso se produce porque una de las propiedades de la
clase necesita leer y escribir en la rama del registro
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services". Si el usuario
no tiene privilegios de escritura en esa clave (que normalmente no los
tendrá), se produce un "cuelgue" momentáneo (los famosos dos minutos). Y
esto se producía antes del InitializeComponent del formulario "C", ya que la
variable privada pertenece a ese formulario.

Asignando permisos de escritura al grupo de usuarios sobre esa clave, he
podido solucionar el problema. Sé que hacer eso no es ortodoxo, pero es
inevitable porque la clave necesaria del registro (GuestOnly) sólo se
encuentra en la rama HKLM, al menos que yo sepa.

También pido disculpas al foro porque hace tiempo tuve un problema similar
por el mismo motivo, aunque entonces no llegué a relacionar el retraso en la
ejecución del programa con este motivo). Y si me hubiera funcionado mejor la
memoria (la mía) no hubiera sido necesario este hilo :(

En todo caso, gracias por las respuestas. Un saludo.

Francisco J. Rodríguez



"Francisco J. Rodríguez" escribió en el mensaje
news:
Hola. A ver si soy capaz de exponer bien la duda.

Tengo un formulario "A" que llama a otro "B". Si el resultado de "B" es
correcto (concretamente, si el valor de una de sus propiedades es true),
se cierra "B" y se abre otro "C". El método de "A" sería más o menos así:

private void MostrarFormulario()
{
FormularioB f = new FormularioB();
f.ShowDialog();
if (f.ValorAdecuado = true)
{
f.Dispose();
FormularioC fc = new FormularioC();
fc.ShowDialog();
fc.Dispose();
}
else
{
f.Dispose();
}
}

El problema es el siguiente: Si ejecuto esto desde Visual Studio y como
Administrador del PC, perfecto. Pero hago el instalador de la aplicación,
la instalo, creo un usuario restringido nuevo (en Windows XP Profesional)
y cuando inicio sesión con ese usuario nuevo y ejecuto el programa, tarda
casi dos minutos desde que se inicia el Dispose del formulario "B" hasta
que comienza el InitializeComponent del formulario "C" (también tarda al
iniciar la aplicación, y tarda siempre, no sólo la primera vez). Esto lo
sé por la traza que guardo en un log.

¿Alguien me puede orientar sobre lo que puede estar ocurriendo? Ya he
probado a otorgarle permisos al usuario restringido, restablecer las
directivas de seguridad de NET..., pero sin éxito. El formulario "B" es
sencillo, sólo tiene un par de textbox y un par de botones. No entiendo
por qué se produce ese retraso entre el Dispose de "B" y el
InitializeComponent de "C". Intuyo que tal vez tenga algo que ver con la
configuración de NET o con permisos, pero no estoy seguro.

Gracias, un saludo.
Francisco J. Rodríguez

Respuesta Responder a este mensaje
#2 Octavio Hernandez
17/04/2007 - 21:20 | Informe spam
Francisco,

Al margen del problema de rendimiento, el patrón adecuado de utilización
de formularios modales es a través de try/finally o using. Te recomiendo q
reescribas tu código así:

private void MostrarFormulario()
{
using (FormularioB fb = new FormularioB())
if (fb.ShowDialog() == ModalResult.Ok)
using (FormularioC fc = new FormularioC())
fc.ShowDialog();
}

Slds - Octavio
Respuesta Responder a este mensaje
#3 Francisco J. Rodríguez
18/04/2007 - 10:13 | Informe spam
Efectivamente Octavio, el código que puse no es el más adecuado. Gracias por
la sugerencia.

Saludos.

-
"Octavio Hernandez" escribió en el mensaje
news:%
Francisco,

Al margen del problema de rendimiento, el patrón adecuado de utilización
de formularios modales es a través de try/finally o using. Te recomiendo q
reescribas tu código así:

private void MostrarFormulario()
{
using (FormularioB fb = new FormularioB())
if (fb.ShowDialog() == ModalResult.Ok)
using (FormularioC fc = new FormularioC())
fc.ShowDialog();
}

Slds - Octavio



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