0

メモリ使用量とマルチスレッド アプリケーションに関する技術的な質問があります。

私のシナリオは、定期的に (毎分) 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();

    }
4

2 に答える 2

0

コンピュータは最終的に、すべてを可能な限り CPU に近づけたいと考えているため、スレッドがアクティブな間、メモリからさまざまなレベルのキャッシュに物を移動しようとします。スレッドがスリープ状態になると、コンピューターはさまざまなレベルのキャッシュを解放して、アクティブなタスクのためのスペースを確保し、物事を CPU からどんどん遠ざけようとします (メモリまたはディスクに戻します)。

于 2013-05-23T14:32:43.757 に答える