Создайте переменную среды через приложение Winform, очень медленно - PullRequest
2 голосов
/ 05 января 2012

В приложении Winform я создаю некоторую переменную среды (Windows 7). Создание работает, но это очень медленно, около 9 секунд, чтобы создать его.

Я использую этот код:

Environment.SetEnvironmentVariable(
    variableName, 
    value, 
    EnvironmentVariableTarget.Machine
);

Странно, не правда ли?

См. Журнал:

5/01/2012 08:22:09 : MyVar1
5/01/2012 08:22:18 : MyVar2
5/01/2012 08:22:26 : MyVar3

1 Ответ

1 голос
/ 03 сентября 2013

Проверка того, что у вас запущено, несколько запущенных процессов означают, что вы можете иметь длительную задержку, закрыть все запущенные приложения (Chrome, IE, Notepad и т. Д.) И запустить приложение, чтобы узнать, сколько времени это займет.*

for (int i = 0; i < 5; i++)
{
    stopwatch.Restart();
    Environment.SetEnvironmentVariable(
        "Variable " + i,
        i.ToString(),
        EnvironmentVariableTarget.Machine);
    Console.WriteLine(stopwatch.ElapsedMilliseconds + " Variable:" + i);
}

Этот фрагмент кода (со всеми приложениями на моем компьютере закрытыми) выполнялся каждый SetEnvironmentVariable вызов <300 мс.Также рассмотрите возможность использования <code>EnvironmentVariableTarget.Process, так как это будет быстрее, чем установка переменной для всей машины.

В соответствии с источниками класса 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 .

- Кредит Дмитрию

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