98%的CPU使用率 - 简单的C#服务

时间:2012-08-07 20:35:18

标签: c# service ftp

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

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

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

这是我的应用每10秒钟执行的操作: 1)通过ftp下载日志并存储在字符串日志中。 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;
    }
}

}

感谢所有的投入!

1 个答案:

答案 0 :(得分:4)

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

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

您可能还想考虑将您的投票时间提高到更合理的水平。你真的需要每5秒轮询一次以确保firefox仍在运行吗?