[英]C# do-while increases process memory in every loop. How to fix?
我正在使用C#程序來在DSL路由器出現故障時自動重新啟動它。 到目前為止,我寫道:
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.Net;
namespace RebootRouter
{
static class Program
{
[STAThread]
static void Main()
{
bool ProgramLoop = true;
do
{
CheckAndRun();
System.Threading.Thread.Sleep(180000);
}
while (ProgramLoop == true);
}
public static void CheckAndRun()
{
if (ScreenSaverCheck.IsScreenSaverRunning() == true)
{
if (InternetCheck.IsConnected() == false)
{
string FirefoxBinary = (string)Registry
.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\
Microsoft\Windows\CurrentVersion\
App Paths\firefox.exe", null, false);
Process LaunchMacro = new Process();
LaunchMacro.StartInfo.FileName = FirefoxBinary;
LaunchMacro.StartInfo.Arguments = "imacros://run/?
m=RebootRouter.iim";
LaunchMacro.Start();
}
}
}
public class ScreenSaverCheck
{
public static bool IsScreenSaverRunning()
{
Process[] FullProcessList = Process.GetProcesses();
foreach (Process ProcessFromList in FullProcessList)
{
if (ProcessFromList.ProcessName.EndsWith(".scr"))
{
return true;
}
}
return false;
}
}
public class InternetCheck
{
public static bool IsConnected()
{
try
{
IPAddress[] GoogleIPAddressList = Dns.
GetHostAddresses("google.com");
if (GoogleIPAddressList[0].ToString().Length > 6)
{
return true;
}
}
catch (Exception)
{
}
return false;
}
}
}
}
它可以按預期工作,但是問題在於,每次循環時,該進程的內存使用量都會增加15 KB。 這是正常的還是有優化的方法? 任何幫助將不勝感激。
我補充說:
public static void CheckAndRun()
{
if (ScreenSaverCheck.IsScreenSaverRunning() == true)
{
if (InternetCheck.IsConnected() == false)
{
string FirefoxBinary = (string)Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe", null, false);
using (Process LaunchMacro = new Process())
{
LaunchMacro.StartInfo.FileName = FirefoxBinary;
LaunchMacro.StartInfo.Arguments = "imacros://run/?m=RebootRouter.iim";
LaunchMacro.Start();
}
}
}
}
和:
public class ScreenSaverCheck
{
public static bool IsScreenSaverRunning()
{
Process[] FullProcessList = Process.GetProcesses();
try
{
foreach (Process ProcessFromList in FullProcessList)
{
if (ProcessFromList.ProcessName.EndsWith(".scr"))
{
return true;
}
}
}
finally
{
foreach (Process ProcessFromList in FullProcessList)
{
ProcessFromList.Dispose();
}
}
return false;
}
}
然后我測試了:
static void Main()
{
int MyInteger = 0;
do
{
CheckAndRun();
MyInteger = MyInteger + 1;
}
while (MyInteger < 100000);
}
現在穩定了。 內存不超過5 MB。 非常感謝道格拉斯和羅伯·沃克。
首先,您應該小心釋放其類實現IDisposable
接口的所有對象-在您的情況下為Process
。
例如:
using (Process LaunchMacro = new Process())
{
LaunchMacro.StartInfo.FileName = FirefoxBinary;
LaunchMacro.StartInfo.Arguments = "imacros://run/?m=RebootRouter.iim";
LaunchMacro.Start();
}
處理數組時:
Process[] processes = Process.GetProcesses();
try
{
foreach (Process p in processes)
if (p.ProcessName.EndsWith(".scr"))
return true;
}
finally
{
foreach (Process p in processes)
p.Dispose();
}
您應該在啟動新的firefox進程之前將其殺死。 未連接並不自動表示該進程不再運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.