C#System.Management.Automation.Powershell类在Invoke()调用时泄漏内存

时间:2016-02-25 23:35:05

标签: c# powershell system.management

我有一个C#测试应用程序的代码,它使用PowerShell查询系统信息,在其中我有一些简单的函数,如下所示:

public void GetSystemInfo()
{
    using (PowerShell ps = PowerShell.Create())
    {
        ps.AddCommand("Get-Disk");      // Get-Disk is an example; this varies
        foreach (PSObject result in ps.Invoke())
        {
            // ...
            // Do work here. Process results, etc...
            // ...
        }
    }
}

这很简单,主要来自MSDN示例,如下所示: https://msdn.microsoft.com/en-us/library/dd182449(v=vs.85).aspx

问题在于每次调用此函数时,我都可以看到应用程序的内存占用增长。足迹在调用ps.Invoke()时正在增长,并且从不收缩。 处理数据的方式并不重要;我甚至可以完全评论foreach循环的主体,并且内存永远不会被垃圾收集。

据我所知,通过查看PowerShell类interface,似乎并没有强迫它自我清理的方法,Dispose()显然没有。工作,因为在使用块退出后资源仍然在内存中泄漏。

这是C#PowerShell类实现或PowerShell本身的已知错误吗? 是否有人知道解决方案,或者可能的替代方案?

修改

我现在也尝试了以下结果,结果相同:

public void GetSystemInfo()
{
    Runspace rs = RunspaceFactory.CreateRunspace();
    rs.Open();

    PowerShell ps = PowerShell.Create();
    ps.Runspace = rs;
    ps.AddCommand("Get-Disk");      // Get-Disk is an example; this varies
    foreach (PSObject result in ps.Invoke())
    {
        // ...
        // Do work here. Process results, etc...
        // ...
    }

    rs.Close();
}

再次,超级直截了当。摘自样本here

我想知道这是否是Powershell模块中的一个已知错误。也许我会开始研究Powershell接口(WMI等)的替代方案,因为我需要在不确定的长时间内定期调用这些PS查询。

1 个答案:

答案 0 :(得分:0)

在C#库中确实存在Powershell API的问题。即使强制进行垃圾收集也无法释放内存。

使用WMI调用而不是Powershell替换所有内容可以解决问题。

相关问题