3

Я использую приложение GitHub для Windows. В последнее время я заметил, что запуск консоли PowerShell из приложения GitHub занимает много времени. После некоторых копаний я обнаружил, что медленная команда устанавливает переменную окружения. Более конкретно эти строки в GitUtils.ps1 (часть PoshGit, который использует GitHub):

function setenv($key, $value) {
    [void][Environment]::SetEnvironmentVariable($key, $value, [EnvironmentVariableTarget]::Process)
    [void][Environment]::SetEnvironmentVariable($key, $value, [EnvironmentVariableTarget]::User)
}

Установка переменной для всего процесса выполняется мгновенно, но переменная User занимает много времени. Используя следующий скрипт:

$sw = [Diagnostics.Stopwatch]::StartNew()
[Environment]::SetEnvironmentVariable("Horses", "are neat", [EnvironmentVariableTarget]::User)
$sw.Stop()
$sw.Elapsed

Я вижу, что эта операция занимает более 80 секунд. Настройка User env var с помощью окна расширенных настроек по умолчанию выполняется быстро. Используя Rapid Environment Editor, установка переменной обычно быстрая, но иногда занимает 5-10 секунд, но никогда ничего такого длинного.

У кого-нибудь есть предложения, что может быть причиной этого?

1 ответ1

7

В соответствии с источниками класса Environment (можно найти здесь, строка 864), после установки переменной среды области пользователя / компьютера он вызывает собственную функцию SendMessageTimeout, чтобы уведомить любой процесс об изменениях в среде. Вот выдержка:

IntPtr r = Win32Native.SendMessageTimeout(
    new IntPtr(Win32Native.HWND_BROADCAST), 
    Win32Native.WM_SETTINGCHANGE, 
    IntPtr.Zero, 
    "Environment", 
    0, 
    1000, 
    IntPtr.Zero);

Таким образом, тайм-аут 1000 миллисекунд (1 секунда) предоставляется любому получателю для обработки сообщения. Например, если 5 из них не смогут его обработать, вы можете получить задержку до 5 секунд. Подробнее о SendMessageTimeout можно узнать в MSDN.

Надеюсь, это поможет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .