我正在编写一个执行PowerShell脚本(活动目录、目录管理等)的Web服务。
目前,每个Web请求都会创建一个Runspace实例。由于Runspace初始化是耗时的操作,而且我经常需要导入模块,如ActiveDirectory,这也是耗时的操作。
在这篇博客文章“使用C#管理Exchange 2007收件人”中,Runspace实例被保留在静态字段中。
我想知道如果将Runspace实例保存在静态字段中,是否线程安全?也许这种方法还有其他缺点吗?
谢谢
目前,每个Web请求都会创建一个Runspace实例。由于Runspace初始化是耗时的操作,而且我经常需要导入模块,如ActiveDirectory,这也是耗时的操作。
在这篇博客文章“使用C#管理Exchange 2007收件人”中,Runspace实例被保留在静态字段中。
我想知道如果将Runspace实例保存在静态字段中,是否线程安全?也许这种方法还有其他缺点吗?
谢谢
Runspaces不是线程安全的,也不能保证运行的脚本是线程安全的。
我建议您创建一个RunspacePool,并将您的Web服务排队到其中。这实际上很容易做到。我在v2 ctp3中进行了博客记录,但API在RTM期间没有更改。
http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx
更新:
如果要使用一个或多个模块预加载池中的每个Runspace,请使用RunspaceFactory.CreateRunspacePool(InitialSessionState)重载。有关如何创建和初始化此内容,请参见:
每次创建PowerShell实例时,将池分配给其RunspacePool属性。