我用 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;
}
}
}
感谢所有输入!