2

我一直在使用此 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\EnvironmentHKCU\Volatile Environment没有网络活动

  • 访问域工作站上的域控制器似乎对呼叫的长度没有影响。

  • perfmon显示几乎没有 CPU 使用率,只有初始和结束 I/O 峰值:

    性能图

    此示例中的CreateEnvironmentBlock调用大约需要 12 秒。

  • MSDN 文档推断调用CreateEnvironmentBlock不加载用户配置文件(并且用户已经登录,因此必须加载他们的配置文件):

    仅在加载用户配置文件时设置用户特定的环境变量,例如 %USERPROFILE%。要加载用户的配置文件,请调用 LoadUserProfile 函数。

4

1 回答 1

0

因为为不同的用户创建环境块需要加载该用户的配置文件。如果您在域控制的机器上,这将加倍慢,因为它需要与网络上的 Active Directory 机器交谈并下载配置文件。

于 2012-04-23T00:32:13.363 回答