2011-01-28 14 views
5

Sto usando il metodo di chiamata Environment.SetEnvironmentVariable in C# (.NET 3.5) in questo modo:Environment.SetEnvironmentVariable richiede molto tempo per impostare una variabile a livello di utente o macchina

Environment.SetEnvironmentVariable ( environmentVariable , valore, "Macchina" );

Tuttavia questa singola chiamata richiede più di 2 secondi su diversi sistemi di test (con XP e Windows 7). I figured out che potrebbe essere dovuto al fatto che: "Se la destinazione è Utente o Macchina, le altre applicazioni ricevono notifica dell'operazione impostata da un messaggio Windows WM_SETTINGCHANGE." C'è un modo per sopprimere questa Notifica ad altre applicazioni in modo che il mio ambiente sia impostato rapidamente e ritorni indietro ..?

Si noti che sto avendo un componente che imposta circa 20 variabili d'ambiente e se utilizzo la funzione come ho descritto sopra, ci vuole circa un minuto per completare l'operazione.

Si prega di suggerire !!

risposta

9

Se si disasambica il SetEnvironmentVariable con reflector, nella parte inferiore del metodo si vedrà che WM_SETTINGCHANGE con una chiamata Win32 a SendMessageTimeout. L'handle è HWND_BROADCAST (0xffff), quindi ogni finestra in alto riceve il messaggio e il timeout è impostato su 1000ms. Secondo MSDN:

Se questo parametro è HWND_BROADCAST ((HWND) 0xffff), il messaggio viene inviato a tutti i finestre di primo livello nel sistema, tra cui disabili o invisibili finestre senza proprietario. La funzione non restituisce finché ciascuna finestra non ha scaduto il tempo . Pertanto, il tempo di attesa totale può raggiungere il valore di uTimeout moltiplicato per il numero di finestre di livello superiore .

Ma i fuFlags parametro è impostato su 0.

SMTO_NORMAL (0x0000): La chiamata filo non sia impedito di elaborazione altre richieste mentre attesa che la funzione di tornare.

SMTO_BLOCK (0x0001): impedisce il thread chiamante dalla lavorazione di qualsiasi altro richieste, fino alla funzione rendimenti.

Non sono sicuro se le funzioni si bloccano o meno. È possibile provare a impostare la variabile con solo Win32 e inviare il messaggio broadcast dopo aver impostato tutte le variabili. Oppure puoi accedere direttamente al registro.

+0

Ottima soluzione! Grazie mille. – user844541

Problemi correlati