I am trying to work out an efficient way of calling a Powershell cmdlet for 20-30 files asynchronously. Although the below code is working, the Import-Module step is run for every file which is processed. Unfortunately this Module takes between 3 or 4 seconds to import.
Searching on the web I can find references to RunspacePools & InitialSessionState, but have had issues trying to create a PSHost object which is required in the CreateRunspacePool overload.
Any help would be appreciated.
Thanks
Gavin
.
.
Code sample from my application:
I am using a Parallel ForEach to distribute the files between threads.
Parallel.ForEach(files, (currentFile) =>
{
ProcessFile(currentfile);
});
private void ProcessFile(string filepath)
{
//
// Some non powershell related code removed for simplicity
//
// Start PS Session, Import-Module and Process file
using (PowerShell PowerShellInstance = PowerShell.Create())
{
PowerShellInstance.AddScript("param($path) Import-Module MyModule; Process-File -Path $path");
PowerShellInstance.AddParameter("path", filepath);
PowerShellInstance.Invoke();
}
}
CreateRunspacePool($minRunspaces, $maxRunspaces, $iss, $Host)and i still dont know how to create a $Host variable to apply.$Hostis TypeName: System.Management.Automation.Internal.Host.InternalHost that's created when the Powershell console is opened. Are you looking to create a pool of RunSpaces that all have the desired module loaded?