0

我用 C# 编写了一个简单的应用程序。它通过 ftp 下载日志文件,检查 Firefox 是否在 PC 上运行,更改日志字符串,将日志上传回服务器。

我使用计时器每 10 秒运行一次。

服务启动时,其内存使用量为 10Mb,CPU 使用率 <1%。大约两分钟后,它的内存使用量约为 12Mb,但 CPU 使用率跃升至 90% 以上!

这是我的应用每 10 秒执行的操作:1) 通过 ftp 下载日志并存储在字符串 log中。2)查看PC上运行的进程列表,如果有firefox.exe进程,适当更改日志字符串以指示firefox正在运行。3)将日志字符串保存为txt文件,读取文件通过ftp将id发送回服务器。

我怀疑将几行文本保存/读取到硬盘驱动器需要如此多的 CPU 能力。

对可能发生的事情有任何猜测吗?谢谢!!

编辑:这是我的全班

class Program : System.ServiceProcess.ServiceBase
{
    private static System.Timers.Timer timer;

    static string myIP = "";

    static void start()
    {
        string strHostName = Dns.GetHostName();
        IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
        IPAddress[] addr = ipEntry.AddressList;

        int i = 0;
        foreach (IPAddress address in addr)
        {
            if (("" + addr[i].AddressFamily).Equals("InterNetwork"))
                myIP = "" + addr[i];
            i++;
        }

        timer = new System.Timers.Timer();
        timer.Elapsed += new ElapsedEventHandler(firefoxChecker); // Everytime timer ticks, timer_Tick will be called
        timer.Interval = (1000) * (5);             
        timer.Enabled = true;                       // Enable the timer
        timer.Start();
    }

    protected override void OnStart(string[] args)
    {
        start();
    }


    public static void Main()
    {
        System.ServiceProcess.ServiceBase.Run(new Program());
    }

    static string downloadLog()
    {
        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://server/log.txt"));

        // Provide the WebPermission Credintials
        reqFTP.Credentials = new NetworkCredential("username", "password");
        reqFTP.Proxy = null;
        reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;

        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();

        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);
        string log = reader.ReadToEnd();
        reader.Close();
        reader.Dispose();
        return log;
    }

    static void sendLogThroughFTP(string log)
    {
        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://server/log.txt"));

        reqFTP.Credentials = new NetworkCredential("username", "password");
        reqFTP.Proxy = null;
        reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
        StreamWriter wr = new StreamWriter(@"C:\logs\temp.txt");
        wr.Write(log);
        wr.Close();

        StreamReader sourceStream = new StreamReader(@"C:\logs\temp.txt");
        byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
        sourceStream.Close();
        reqFTP.ContentLength = fileContents.Length;
        Stream requestStream = reqFTP.GetRequestStream();
        requestStream.Write(fileContents, 0, fileContents.Length);
        requestStream.Close();
        sourceStream.Dispose();
    }

    static void firefoxChecker(object sender, EventArgs e)
    {

        string firefoxOwner = "----------";
        TerminalServicesManager manager = new TerminalServicesManager();
        ITerminalServer server = null;

        string log = downloadLog();

        bool diceFirefoxRunning = false;
        bool monsterFirefoxRunning = false;
        bool careerbuilderFirefoxRunning = false;

        try
        {
            server = manager.GetLocalServer();
            server.Open();
            foreach (ITerminalServicesSession session in server.GetSessions())
            {
                if (session.ConnectionState == ConnectionState.Active)
                {
                    firefoxOwner = session.UserAccount.ToString();
                    string ip = session.ClientIPAddress.ToString();

                    string user = session.UserAccount.ToString();

                    System.Collections.Generic.IList<Cassia.ITerminalServicesProcess> list = session.GetProcesses();
                    foreach (ITerminalServicesProcess process in list)
                    {
                        if (Equals(process.ProcessName, "firefox.exe"))
                        {
                            // change firefoxOwner string appropriately
                            log = updateLog(log, user, firefoxOwner);
                        }
                    }
                }
            }
            server.Close();
            sendLogThroughFTP(log);
        }
        catch
        {
            // do nothing
        }
    }

    static string updateLog(string log, string username, string ffOwner)
    {
                // make some changes to log string
                return log;
    }
}

}

感谢所有输入!

4

1 回答 1

4

开始工作时禁用计时器,完成后重新启用它。

您正在通过 FTP 下载和上传,这可能需要超过您为计时器设置的 5 秒。如果您在开始之前禁用计时器并在结束时重新启用它,您将在最后一次上传完成后 5 秒进行轮询。

您可能还需要考虑将投票时间延长到更合理的时间。您真的需要每 5 秒轮询一次以确保 Firefox 仍在运行吗?

于 2012-08-07T20:38:34.163 回答