サーバーからメールをダウンロードするときの速度が遅いことは理解しています。しかし、プログラムを実行してハードディスクからメッセージを読み込んだり読み込んだりするとき、それを速くする方法はありますか?
コンストラクターで、バックグラウンドワーカーを開始します
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です