0

C# で簡単なアプリケーションを作成しました。ftp 経由でログ ファイルをダウンロードし、PC で Firefox が実行されているかどうかを確認し、ログ文字列を変更し、ログをサーバーにアップロードします。

タイマーを使用して10秒ごとに実行しています。

サービス開始時のメモリ使用量は 10Mb で、CPU 使用率は 1% 未満です。約 2 分後、メモリ使用量は ~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 秒後にポーリングされます。

また、ポーリング時間をもう少し合理的なものに増やすことを検討することもできます。Firefox がまだ実行されていることを確認するために、5 秒ごとにポーリングする必要がありますか?

于 2012-08-07T20:38:34.163 に答える