Environment.SetEnvironmentVariable需要很长时间才能在用户或计算机级别设置变量

时间:2011-01-28 07:44:23

标签: c# environment-variables

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

  

Environment.SetEnvironmentVariable(                       environmentVariable,                       值,                       “机”                   );

然而,在单个测试系统(运行XP和Windows 7)上,这个单个调用需要2秒多的时间。 我figured out这可能是因为:“如果目标是User或Machine,则其他应用程序会通过Windows WM_SETTINGCHANGE消息通知设置操作。” 有没有办法将此Notification抑制到其他应用程序,以便快速设置我的环境并返回..?

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

请建议!!

1 个答案:

答案 0 :(得分:10)

如果您使用反射器解除SetEnvironmentVariable,您将在方法的底部看到WM_SETTINGCHANGE,其中Win32调用SendMessageTimeout。句柄是HWND_BROADCAST(0xffff),因此每个顶部窗口都获取消息,超时设置为1000ms。根据msdn:

  

如果此参数为HWND_BROADCAST   ((HWND)0xffff),消息被发送到   系统中的所有顶级窗口,   包括残疾人或隐形人士   无主的窗户。该功能没有   返回,直到每个窗口有时间   出。因此,总等待时间   可以达到uTimeout的值   乘以顶级数   窗户。

但是fuFlags参数设置为0。

  

SMTO_NORMAL(0x0000):通话   不阻止线程   处理其他请求时   等待函数返回。

     

SMTO_BLOCK(0x0001):防止   从处理任何调用线程   其他请求直到该功能   回报。

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