我对内存使用和多线程应用程序有一个技术问题。
我的方案是我已经构建了一个服务器应用程序(在C#中),它不断运行并定期更新数据库信息(每分钟)。该应用程序分为两个线程。第一个线程处理UI。第二个线程处理连续循环中的所有grunt工作(直到Tasks flag = false)。当第二个线程完成其任务时,它进入休眠状态60秒,之后它会循环并再次执行。
应用程序运行愉快,没有内存问题或资源问题,但我注意到一些我不理解的奇怪内容。
当应用程序正在运行(执行其任务)时,它使用100%的可用CPU并且内存降至80k kb。但是当任务完成并且第二个线程进入休眠状态时,内存会增加到180k kb。
如果有人能解释一下,我会很感激吗?
代码
private void BackgroundWorker1()
{
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.DoWork += new DoWorkEventHandler(
delegate(object o, DoWorkEventArgs args)
{
BackgroundWorker b = o as BackgroundWorker;
{
while (Tasks)
{
try
{
SetValue(System.DateTime.Now.ToString() + " - Opening DB Connection \r\n");
GlobalVars.WiFiToolDataSource.Open();
SetValue(System.DateTime.Now.ToString() + " - Starting Task \r\n");
TicketFunctions.GetBOSSTickets();
SetValue(System.DateTime.Now.ToString() + " - Got Tickets from BOSS \r\n");
EmailFunctions.GetEmails("");
SetValue(System.DateTime.Now.ToString() + " - Got Emails from Inbox \r\n");
EmailFunctions.GetEmails("WiFI Survey Archive");
SetValue(System.DateTime.Now.ToString() + " - Got Emails from Archive \r\n");
EmailFunctions.checkEmails("BodyText", GlobalVars.ApplicationData + "Emails");
SetValue(System.DateTime.Now.ToString() + " - Loaded Emails in DB \r\n");
EmailFunctions.CreateEmailIndexes();
SetValue(System.DateTime.Now.ToString() + " - Created Email Indexes \r\n");
TicketFunctions.UpdateTicketList();
SetValue(System.DateTime.Now.ToString() + " - Updated Tickets \r\n");
TicketFunctions.BuildTicketKB();
SetValue(System.DateTime.Now.ToString() + " - Finished Build Knowledge Base \r\n");
SetValue(System.DateTime.Now.ToString() + " - Finished Refresh \r\n");
if (!Tasks)
break;
if (System.DateTime.Now.Hour.ToString("HH") == "00")
{
if (newFile)
{
string CDate = System.DateTime.Now.AddDays(-1).ToString("ddMMyyyy");
string FileName = "QA_LOG_" + CDate + ".txt";
System.IO.File.WriteAllText(GlobalVars.ApplicationData + @"QA Server Log\" + FileName, textBox1.Text);
ClearValue();
newFile = false;
}
}
if (System.DateTime.Now.Hour.ToString("HH") == "01")
{
newFile = true;
}
Thread.Sleep(60000);
}
catch (Exception e)
{
SetValue("Error : " + e.ToString() + " \r\n"); ;
}
finally
{
GlobalVars.WiFiToolDataSource.Close();
}
}
}
});
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
delegate(object o, RunWorkerCompletedEventArgs args)
{
SetValue(System.DateTime.Now.ToString() + " - Complete \r\n");
});
bw.RunWorkerAsync();
}
答案 0 :(得分:0)
可能性是后续任务之一,是一个内存密集程度较高的任务,而较早的任务需要更长时间,但不会消耗尽可能多的内存。
鉴于您正在睡眠60秒,垃圾收集很可能会在该时间段内的某个时间运行,从而在下一次迭代开始之前将内存恢复原状。
如果不了解您的功能细节,就无法详细了解。
答案 1 :(得分:0)
计算机最终希望所有内容尽可能接近CPU,因此当线程处于活动状态时,它会尝试将内存移出各种级别的缓存。当线程进入休眠状态时,计算机将尝试释放不同级别的缓存,为活动任务腾出空间,使事物越来越远离CPU(返回内存或磁盘)。