多线程Windows应用程序在空闲时使用更多内存

时间:2013-05-23 14:22:50

标签: c# multithreading memory

我对内存使用和多线程应用程序有一个技术问题。

我的方案是我已经构建了一个服务器应用程序(在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();

    }

2 个答案:

答案 0 :(得分:0)

可能性是后续任务之一,是一个内存密集程度较高的任务,而较早的任务需要更长时间,但不会消耗尽可能多的内存。

鉴于您正在睡眠60秒,垃圾收集很可能会在该时间段内的某个时间运行,从而在下一次迭代开始之前将内存恢复原状。

如果不了解您的功能细节,就无法详细了解。

答案 1 :(得分:0)

计算机最终希望所有内容尽可能接近CPU,因此当线程处于活动状态时,它会尝试将内存移出各种级别的缓存。当线程进入休眠状态时,计算机将尝试释放不同级别的缓存,为活动任务腾出空间,使事物越来越远离CPU(返回内存或磁盘)。