我正在使用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的速度增加内存使用量。这是正常的还是有一种优化方式?任何帮助都将非常感激。
答案 0 :(得分:1)
我补充说:
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。非常感谢Douglas和Rob Walker。
答案 1 :(得分:0)
首先,您应该注意处理其类实现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();
}
答案 2 :(得分:0)
您应该在启动新的firefox进程之前终止它们。未连接不会自动意味着该进程不再运行。