簡體   English   中英

C#同時執行會在每個循環中增加進程內存。 怎么修?

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

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