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

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

Environment.SetEnvironmentVariable(environmentVariable,value,“Machine”);

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

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

请建议!!

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

如果此参数为HWND_BROADCAST((HWND)0xffff),则会将消息发送到系统中的所有顶级窗口,包括禁用或隐藏的无主窗口。 在每个窗口超时之前,该函数不会返回。 因此,总等待时间可以达到uTimeout的值乘以顶级窗口的数量。

但fuFlags参数设置为0。

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

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

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