メモリ使用量とマルチスレッド アプリケーションに関する技術的な質問があります。
私のシナリオは、定期的に (毎分) DB 情報を実行し、更新するサーバー アプリケーション (C# で) を構築したことです。アプリケーションは 2 つのスレッドに分割されます。最初のスレッドは UI を処理します。2 番目のスレッドは、すべての単調な作業を連続ループで処理します (Tasks フラグ = false まで)。2 番目のスレッドがタスクを完了すると、60 秒間スリープ状態になり、その後ループして再び実行します。
アプリケーションは、メモリの問題やリソースの問題もなく問題なく動作しますが、理解できない奇妙な点に気付きました。
アプリケーションが動作している (タスクを実行している) 場合、使用可能な CPU を 100% 使用し、メモリは 80kb に低下します。しかし、タスクが終了して 2 番目のスレッドがスリープ状態になると、メモリは最大 180kb になります。
誰かがこれを説明できれば幸いです。
コード
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();
}