2011-01-28 9 views
5

estoy usando el método llamado Environment.SetEnvironmentVariable en C# (.NET 3.5) así:Environment.SetEnvironmentVariable tarda mucho tiempo para establecer una variable a nivel de usuario o de equipo

Environment.SetEnvironmentVariable ( EnvironmentVariable , valor, "Máquina" );

Sin embargo, esta sola llamada demora más de 2 segundos en varios sistemas de prueba (ejecutando XP y Windows 7). I figured out Esto podría deberse a que: "Si el destino es Usuario o Máquina, el mensaje WM_SETTINGCHANGE de Windows notificará a otras aplicaciones de la operación establecida". ¿Hay alguna forma de suprimir esta Notificación a otras aplicaciones para que mi entorno se configure rápidamente y regrese ...?

Tenga en cuenta que estoy teniendo un componente que establece alrededor de 20 variables de entorno y si utilizo la función como he descrito anteriormente, se tarda alrededor de un minuto para terminar esa tarea.

¡Por favor sugiéranlo!

Respuesta

9

Si realiza un desarme de SetEnvironmentVariable con reflector, verá en la parte inferior del método que el WM_SETTINGCHANGE con una llamada de Win32 a SendMessageTimeout. El identificador es HWND_BROADCAST (0xffff), por lo que cada ventana superior recibe el mensaje y el tiempo de espera se establece en 1000 ms. De acuerdo con MSDN:

Si este parámetro es HWND_BROADCAST ((HWND) 0xffff), el mensaje se envía a todas las ventanas de nivel superior en el sistema, incluyendo ventanas sin dueño discapacitados o invisibles. La función no devuelve hasta que cada ventana haya temporizado . Por lo tanto, el tiempo total de espera puede ser hasta el valor de uTimeout multiplicado por el número de ventanas de nivel superior .

Pero los fuFlags parámetro se establece en 0.

SMTO_NORMAL (0x0000): El subproceso de llamada no se le impide el procesamiento de solicitudes, mientras que otros la espera de que la función retorne.

SMTO_BLOCK (0x0001): Impide que el subproceso de llamada del procesamiento de cualquier otro solicitudes hasta que la función devoluciones.

No estoy seguro si las funciones bloquean o no. Puede intentar establecer la variable solo con Win32 y solo enviar el mensaje de difusión después de establecer todas las variables. O puede acceder directamente al registro.

+0

¡Muy buena solución! Muchas gracias. – user844541

Cuestiones relacionadas