我一直在使用此 CodeProject 页面ProcessStarter
中的C# 类作为 Windows 服务中的交互式用户启动一个进程。
我注意到(在运行 Win7 和 XP 的大约 50 台不同的计算机上测试代码之后)P/Invoke 调用CreateEnvironmentBlock
(在Run
方法中)可能需要长达 30 秒才能返回(有时很快,有时不是) .
我看到其他人有这个问题,但他们得到了一个错误(对我来说它总是有效的)。
为什么通话CreateEnvironmentBlock
要花这么长时间?
P/Invoke 声明:
[DllImport("userenv.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool CreateEnvironmentBlock(out IntPtr lpEnvironment, IntPtr hToken, bool bInherit);
CreateEnvironmentBlock
称呼:
IntPtr lpEnvironment = IntPtr.Zero;
bool resultEnv = CreateEnvironmentBlock(out lpEnvironment, primaryToken, false);
编辑:附加信息:
它并不总是30 秒 - 它(在不同的计算机上)在几秒到 30 秒之间变化。
procmon
显示了一大堆对 和 等键的注册表读取HKLM\System\CurrentControlSet\Control\Session Manager\Environment
,HKCU\Volatile Environment
但没有网络活动。访问域工作站上的域控制器似乎对呼叫的长度没有影响。
perfmon
显示几乎没有 CPU 使用率,只有初始和结束 I/O 峰值:此示例中的
CreateEnvironmentBlock
调用大约需要 12 秒。MSDN 文档推断调用
CreateEnvironmentBlock
不加载用户的配置文件(并且用户已经登录,因此必须加载他们的配置文件):仅在加载用户配置文件时设置用户特定的环境变量,例如 %USERPROFILE%。要加载用户的配置文件,请调用 LoadUserProfile 函数。