diff --git a/Engine/CommandInfoCache.cs b/Engine/CommandInfoCache.cs
index 67e35c211..61e78d86b 100644
--- a/Engine/CommandInfoCache.cs
+++ b/Engine/CommandInfoCache.cs
@@ -12,20 +12,44 @@ namespace Microsoft.Windows.PowerShell.ScriptAnalyzer
///
/// Provides threadsafe caching around CommandInfo lookups with `Get-Command -Name ...`.
///
- internal class CommandInfoCache
+ internal class CommandInfoCache : IDisposable
{
private readonly ConcurrentDictionary> _commandInfoCache;
private readonly Helper _helperInstance;
private readonly RunspacePool _runspacePool;
+ private bool disposed = false;
///
/// Create a fresh command info cache instance.
///
- public CommandInfoCache(Helper pssaHelperInstance, RunspacePool runspacePool)
+ public CommandInfoCache(Helper pssaHelperInstance)
{
_commandInfoCache = new ConcurrentDictionary>();
_helperInstance = pssaHelperInstance;
- _runspacePool = runspacePool;
+ _runspacePool = RunspaceFactory.CreateRunspacePool(1, 10);
+ _runspacePool.Open();
+ }
+
+ /// Dispose the runspace pool
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if ( disposed )
+ {
+ return;
+ }
+
+ if ( disposing )
+ {
+ _runspacePool.Dispose();
+ }
+
+ disposed = true;
}
///
diff --git a/Engine/Helper.cs b/Engine/Helper.cs
index 330547d02..71be95b4b 100644
--- a/Engine/Helper.cs
+++ b/Engine/Helper.cs
@@ -30,7 +30,6 @@ public class Helper
private PSVersionTable psVersionTable;
private readonly Lazy _commandInfoCacheLazy;
- private readonly RunspacePool _runSpacePool;
private readonly object _testModuleManifestLock = new object();
#endregion
@@ -116,11 +115,7 @@ internal set
///
private Helper()
{
- // There are 5 rules that use the CommandInfo cache but one rule (AvoidAlias) makes parallel queries.
- // Therefore 10 runspaces was a heuristic measure where no more speed improvement was seen.
- _runSpacePool = RunspaceFactory.CreateRunspacePool(1, 10);
- _runSpacePool.Open();
- _commandInfoCacheLazy = new Lazy(() => new CommandInfoCache(pssaHelperInstance: this, runspacePool: _runSpacePool));
+ _commandInfoCacheLazy = new Lazy(() => new CommandInfoCache(pssaHelperInstance: this));
}
///
@@ -309,7 +304,6 @@ public PSModuleInfo GetModuleManifest(string filePath, out IEnumerable