【问题标题】:Environment.SetEnvironmentVariable takes a long time to set a variable at User or Machine levelEnvironment.SetEnvironmentVariable 在用户或机器级别设置变量需要很长时间
【发布时间】:2011-01-28 07:44:23
【问题描述】:

我在 C# (.NET 3.5) 中使用 Environment.SetEnvironmentVariable 方法调用,如下所示:

Environment.SetEnvironmentVariable( 环境变量, 价值, “机器” );

但是,在多个测试系统(同时运行 XP 和 Windows 7)上,这个单一调用需要 2 秒多的时间。 我figured out 这可能是因为:“如果目标是用户或机器,其他应用程序会通过 Windows WM_SETTINGCHANGE 消息通知设置操作。” 有什么办法可以禁止向其他应用程序发送此通知,以便快速设置我的环境并返回..?

请注意,我有一个设置了大约 20 个环境变量的组件,如果我使用上面描述的函数,完成该任务大约需要一分钟。

请推荐!!

【问题讨论】:

  • 在我的 Windows 10 Enterprise、.NET 4.5 上设置 1 个 Env var 的相同方法调用耗时超过 20 秒

标签: c# environment-variables


【解决方案1】:

如果您使用反射器禁用 SetEnvironmentVariable,您将在方法的底部看到 WM_SETTINGCHANGE 通过 Win32 调用 SendMessageTimeout。句柄是 HWND_BROADCAST (0xffff),因此每个顶部窗口都会收到消息,并且超时设置为 1000 毫秒。根据msdn:

如果这个参数是HWND_BROADCAST ((HWND)0xffff),消息被发送到 系统中的所有顶层窗口, 包括禁用或隐形 无主的窗户。该功能不 返回直到每个窗口都计时 出去。因此,总等待时间 可以达到 uTimeout 的值 乘以顶层数 窗户。

但是fuFlags参数设置为0。

SMTO_NORMAL (0x0000):调用 线程不被阻止 处理其他请求,同时 等待函数返回。

SMTO_BLOCK (0x0001):防止 从处理任何调用线程 其他请求直到函数 返回。

我不确定这些功能是否阻塞。您可以尝试仅使用 Win32 设置变量,并在设置所有变量后才发送广播消息。或者您可以直接访问注册表。

【讨论】:

    猜你喜欢
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2020-08-26
    • 2014-10-09
    • 2012-11-26
    • 2019-12-27
    相关资源
    最近更新 更多