私は少し問題に遭遇しました。2つのスレッドがあります。1つはループを実行し、毎回GUIのスレッドに数値を返したり送信したりする必要があります。このために、BackGroundWorkerとReportProgressを使用します。
そのようなことを言ってみましょう:
私はBackGroundWorkerを持っており、 0から何でもカウントする単純なループを実行します(DoWork)。ループへのすべてのエントリは、ReportProgressイベントを使用してカウンターをGUIのスレッドに送信し、カウンターの値を出力します。
void worker_DoWork(object sender, DoWorkEventArgs e)
{
int count = 0;
BackgroundWorker Worker = (BackgroundWorker)sender;
while (count < 10000000)
{
Worker.ReportProgress(count);
count++;
}
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
txt.Text = e.ProgressPercentage.ToString();
}
現在、この操作によりGUIがフリーズします。
ReportProgressがBackGroundWorkerを作成したスレッドでProgressChangeハンドラーを呼び出していることを理解しているので、ループが非常に高速に実行されているため、GUIのスレッドが必要に応じて値を出力できません。
GUIをフリーズせずにそのようなタスクを実行するにはどうすればよいですか?
ディスパッチャーについて聞いたことがありますが、それが何に使用されるのかよくわかりません。