-1

サーバーからメールをダウンロードするときの速度が遅いことは理解しています。しかし、プログラムを実行してハードディスクからメッセージを読み込んだり読み込んだりするとき、それを速くする方法はありますか?

コンストラクターで、バックグラウンドワーカーを開始します

DirectoryInfo di = new DirectoryInfo(emailsDirectory);
            files = di.GetFiles();
            if (files.Length > 0)
            {
                backgroundWorker2.RunWorkerAsync();
            }

その後、ドワークイベントで

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            int counter = 0;
            MimekitallLoadedMessages = new List<MimeKit.MimeMessage>();
            MimeKit.MimeMessage loadedMessage = null;
            DirectoryInfo di = new DirectoryInfo(emailsDirectory);
            FileInfo[] files = di.GetFiles();
            for (int i = 0; i < files.Length; i++)
            {
                string uid = seenUids[0];
                loadedMessage = MimeKit.MimeMessage.Load(files[i].FullName);
                MimekitallLoadedMessages.Add(loadedMessage);
                downloaded.Add(seenUids[i]);
                counter += 1;
                int nProgress = counter * 100 / files.Length;
                backgroundWorker2.ReportProgress(nProgress);
            }
        }

次に、progressChanged イベントで、progressBar pbt1 と listView(ListViewCostumControl.lvnf) を更新します。

private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            pbt1.Value = e.ProgressPercentage;
            pbt1.Text = e.ProgressPercentage.ToString() + "%";
            pbt1.Invalidate();
            ListViewCostumControl.lvnf.Items.Add(new ListViewItem(new string[]
            {
              MimekitallLoadedMessages[countUploadMsg].From.ToString(),         //From Column
              MimekitallLoadedMessages[countUploadMsg].Subject,                 //Subject Column
              MimekitallLoadedMessages[countUploadMsg].Date.ToString()      //Date Column
            }));
            countUploadMsg += 1;
        }

そして、これは pbt1 のクラス部分であり、おそらくこれにより遅くなりますか? わからない

public class ProgressBarWithText : ProgressBar
        {
            const int WmPaint = 15;
            SizeF TextSize;
            PointF TextPos;
            bool dontpaint = false;

            public ProgressBarWithText()
            {
                this.DoubleBuffered = true;
                this.TextChanged += ProgressBarWithText_TextChanged;
                this.SizeChanged += ProgressBarWithText_SizeChanged;
            }

            public override string Text
            {
                get { return base.Text; }
                set { base.Text = value; }
            }

            void RecalcTextPos()
            {
                if (this.IsDisposed == true)
                    return;
                if (string.IsNullOrEmpty(base.Text))
                    return;

                using (var graphics = Graphics.FromHwnd(this.Handle))
                {
                    TextSize = graphics.MeasureString(base.Text, this.Font);
                    TextPos.X = (this.Width / 2) - (TextSize.Width / 2);
                    TextPos.Y = (this.Height / 2) - (TextSize.Height / 2);
                }
            }

            void ProgressBarWithText_SizeChanged(object sender, EventArgs e)
            {
                RecalcTextPos();
            }

            void ProgressBarWithText_TextChanged(object sender, EventArgs e)
            {
                RecalcTextPos();
            }

            protected override void WndProc(ref System.Windows.Forms.Message m)
            {
                base.WndProc(ref m);

                if (dontpaint == false)
                {
                    switch (m.Msg)
                    {
                        case WmPaint:
                            using (var graphics = Graphics.FromHwnd(Handle))
                                graphics.DrawString(base.Text, base.Font, Brushes.Black, TextPos.X, TextPos.Y);

                            break;
                    }
                }
            }

            protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams result = base.CreateParams;
                    result.ExStyle |= 0x02000000; // WS_EX_COMPOSITED 
                    return result;
                }
            }
        }

ハードディスクからメッセージをロードするプロセス全体が非常に遅いようです。私が読み込んだ/ロードしたハードディスク上のファイルはemlのタイプで、一部のファイルサイズは8 KBで、一部は380 KBで、1つは4 MBです

4

1 に答える 1

0

「非常に遅い」と思うものは何ですか?

MimeKit を使用してすべてのメッセージをロードする単純なプログラムのパフォーマンスと、進行状況レポートを使用してプログラムにかかる時間を比較しましたか?

進行状況の報告が遅さの原因になっているのではないかと考えたことはありますか? 一般に、小さな作業ごとに進捗状況を報告するのではなく、進捗状況が大幅に変化した場合にのみ報告する必要があります。

何千ものメッセージを読み込んでいて、すべてのメッセージの後に UI を再描画する場合、不要な再レンダリングが大量に発生します。

それでも十分に高速でない場合は、すべてのメッセージをメモリにロードしないことを検討しましたか? 必要なときにだけロードしないのはなぜですか? 問題は、メモリに非常に多くのメッセージをロードしているため、システムがディスクにスワップされている可能性があります。

于 2016-05-25T16:08:34.010 に答える