2011-02-11 67 views
9

我正在編寫一個執行powershell腳本(活動目錄,目錄管理等)的Web服務。在web應用程序中託管powershell運行空間

現在,運行空間實例是根據Web請求創建的。由於Runspace初始化操作非常耗時,而且經常需要導入模塊,例如ActiveDirectory,這些操作也很慢。

在這篇博客文章Managing Exchange 2007 Recipients with C#中,Runspace實例保存在一個靜態字段中。

我漫步如果我將Runspace實例保留在靜態字段中,它會是線程安全的嗎?也許這樣做有其他缺點嗎?

感謝

回答

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財產。

+0

啊哈,太棒了!所以我應該創建靜態字段RunspacePool,然後將其傳遞給每個Web請求中執行的每個Powershell實例。有沒有辦法將模塊預加載到池中的運行空間?也許我甚至不需要那樣做? – 2011-02-11 19:14:07

相關問題