9

我正在编写一个执行 powershell 脚本(活动目录、目录管理等)的 Web 服务。

现在,Runspace实例是根据 Web 请求创建的。由于 Runspace 初始化是一项耗时的操作,而且我经常需要导入模块,例如 ActiveDirectory,这些操作也很慢。

在这篇博客文章使用 C# 管理 Exchange 2007 收件人中,运行空间实例保存在静态字段中。

我徘徊如果我将 Runspace 实例保留在静态字段中,它会是线程安全的吗?也许这样做还有其他缺点?

谢谢

4

1 回答 1

12

运行空间不是线程安全的,它们也不能保证它们运行的​​脚本也是线程安全的。

我建议您创建一个 RunspacePool 并让您的 Web 服务队列为其工作。这实际上很容易做到。我为 v2 ctp3 写了一篇博客,但 RTM 的 API 没有改变。

http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx

更新:

如果要使用一个或多个模块预加载池中的每个运行空间,请使用 RunspaceFactory.CreateRunspacePool(InitialSessionState) 重载。要了解如何创建和初始化它,请参阅:

http://www.nivot.org/2010/05/03/PowerShell20DeveloperEssentials1InitializingARunspaceWithAModule.aspx

每次创建 PowerShell 实例时,将池分配给它的 RunspacePool 属性。

于 2011-02-11T15:28:07.583 回答