簡體   English   中英

C#System.Management.Automation.Powershell類在Invoke()調用時泄漏內存

[英]C# System.Management.Automation.Powershell class leaking memory on Invoke() call

我有一個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類接口可以看出,似乎沒有辦法強制它自行清理,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();
}

再次,超級直截了當。 取自這里的樣本。

我想知道這是否是Powershell模塊中的一個已知錯誤。 也許我會開始研究Powershell接口(WMI等)的替代品,因為我需要在不確定的長持續時間內定期調用這些PS查詢。

確實,C#庫中的Powershell API確實存在問題。 即使強制垃圾收集也似乎沒有釋放內存。

用WMI調用而不是Powershell替換所有內容消除了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM