2012-08-07 16 views
0

我在C#中編寫了一個簡單的應用程序。它通過ftp下載日誌文件,檢查PC上是否運行firefox,更改日誌字符串,將日誌上傳回服務器。98%的CPU使用率 - 簡單的C#服務

我正在運行它每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; 
    } 
} 

}

感謝所有的投入!

+11

如果沒有看到任何代碼,很難分辨發生了什麼。你可能犯過許多性能問題。 – 2012-08-07 20:36:17

+0

分享一些代碼..它可以幫助他人理解你的問題。 – MethodMan 2012-08-07 20:43:36

+3

您如何處理您的流程花費超過10秒的可能性?如果ftp下載由於某種原因而停止,並且10秒鐘後,它還沒有完成,但是您又一次(又一次,一次又一次)關閉了該功能。您最終可能會遇到所有嘗試在系統上同時執行的進程積壓。 – Cypher 2012-08-07 20:46:31

回答

4

當你開始做你的工作時禁用定時器,當你完成後重新啓用定時器。

您正在通過FTP下載和上傳,這可能需要超過5秒鐘才能設置您的計時器。如果您在啓動之前禁用計時器並在最後重新啓用該計時器,則將在上次上載完成後的5秒內輪詢。

您可能還想考慮增加您的投票時間,使其更合理一些。你真的需要每5秒輪詢一次以確保Firefox仍在運行?

+1

下面是我對併發進程的評論的解決方案。這看起來可能會有所斬獲。 – Cypher 2012-08-07 20:50:24

+0

謝謝你們!是的,這似乎是一個問題。 – Krzysiek 2012-08-07 20:57:30