Environment.SetEnvironmentVariable занимает много времени, чтобы установить переменную на уровне пользователя или компьютера - PullRequest
6 голосов
/ 28 января 2011

Я использую вызов метода Environment.SetEnvironmentVariable в C # (.NET 3.5) следующим образом:

Environment.SetEnvironmentVariable ( environmentVariable, значение, "Машина" );

Однако этот один вызов занимает более 2 секунд в нескольких тестовых системах (работающих под управлением XP и Windows 7). Я выяснил , что это может быть из-за того, что: «Если целью является Пользователь или Компьютер, другие приложения уведомляются о работе набора сообщением Windows WM_SETTINGCHANGE». Есть ли способ подавить это Уведомление другим приложениям, чтобы моя среда была быстро настроена и возвращалась обратно ...?

Обратите внимание, что у меня есть компонент, который устанавливает около 20 переменных среды, и если я использую функцию, как описано выше, выполнение этой задачи занимает около минуты.

Пожалуйста, предложите !!

1 Ответ

10 голосов
/ 28 января 2011

Если вы отключите переменную SetEnvironmentVariable с отражателем, вы увидите в нижней части метода, что WM_SETTINGCHANGE с Win32 вызывает SendMessageTimeout. Дескриптор HWND_BROADCAST (0xffff), поэтому каждое верхнее окно получает сообщение, и время ожидания установлено на 1000 мс. Согласно MSDN:

Если этот параметр HWND_BROADCAST ((HWND) 0xffff), сообщение отправляется все окна верхнего уровня в системе, в том числе отключенный или невидимый неизвестные окна. Функция не возвращаться до тех пор, пока не будет установлено время каждого окна из. Поэтому общее время ожидания может быть до значения uTimeout умножить на количество верхнего уровня окна.

Но для параметра fuFlags установлено значение 0.

SMTO_NORMAL (0x0000): вызывающий нить не мешает обрабатывая другие запросы в то время как ожидание возврата функции.

SMTO_BLOCK (0x0001): предотвращает вызывающий поток от обработки любого другие запросы до функции возвращается.

Я не уверен, блокируют ли функции или нет. Вы можете попытаться установить переменную только с Win32 и отправить широковещательное сообщение только после того, как вы установите все переменные. Или вы можете получить прямой доступ к реестру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...