[英]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.