![](/img/trans.png)
[英]System.Management.Automation.Powershell RunAs Admin
[英]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.