I'm writing a web service that executes powershell scripts (active directory, directory management, etc).
Right now, Runspace instance is created per web request. As Runspace initialization is time consuming operation, plu开发者_运维知识库s often I have to import modules, like ActiveDirectory, which are also slow operations.
In this blog post Managing Exchange 2007 Recipients with C# , the Runspace instance is kept in a static field.
I wander what if I keep Runspace instance in static field, would it be thread safe? Maybe there are other drawbacks of doing it this way?
Thanks
Runspaces are not thread-safe, nor can they guarantee that the scripts they are running are either.
I would suggest you create a RunspacePool and have your web service queue work to it. This is actually pretty easy to do. I blogged about it for v2 ctp3, but the API has not changed for RTM.
http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx
update:
If you want to preload each runspace in the pool with one or more modules, use the RunspaceFactory.CreateRunspacePool(InitialSessionState) overload. To see how to create and initialize this, see:
http://www.nivot.org/2010/05/03/PowerShell20DeveloperEssentials1InitializingARunspaceWithAModule.aspx
Every time you create a PowerShell instance, assign the pool to its RunspacePool property.
精彩评论