【问题标题】:Create environment variable via Winform application, very slow通过 Winform 应用程序创建环境变量,非常慢
【发布时间】:2012-02-03 01:45:27
【问题描述】:

在 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

【问题讨论】:

  • 您真的需要它们还是不能在应用程序设置中拥有它们
  • @V4Vendetta 是的,需要它们。应用程序,是一种为主应用程序设置环境(设置这些变量是工作的一部分)的安装程序。
  • [variableName][value] 的值是多少?你在日志之间做其他事情吗?一些代码会很有帮助。

标签: c# winforms environment-variables


【解决方案1】:

检查您正在运行的内容,多个正在运行的进程意味着您可能会有很长的延迟,关闭您正在运行的所有应用程序(Chrome、IE、记事本等)并运行该应用程序以查看需要多长时间。

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

这段代码(我机器上的所有应用程序都关闭)在 SetEnvironmentVariable 调用。另外,请考虑使用EnvironmentVariableTarget.Process,因为它比为整台机器设置变量要快。

根据Environment类源码(可以找到here,第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

--感谢Dmitry

【讨论】:

猜你喜欢
  • 2020-07-14
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 2021-01-24
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多