このクラスを利用して、Progress
関係者全員が長時間実行される操作中に UI を簡単に更新できるようにすることができます。Progress
フォーム内にクラスを作成し、進行状況が与えられたときに UI を更新する方法を示します。次に、そのオブジェクトを、長時間実行される作業を行う他のクラスに渡します。
private void button1_Click(object sender, EventArgs args)
{
Progress<int> progress = new Progress<int>();
progress.ProgressChanged += (p, value) => progressbar1.Value = value;
Task.Run(() => SomeOtherClass.DoWork("c:/temp.txt", progress));
}
もちろん、長時間実行される作業は、UI のブロックを回避するために別のスレッドで行われます。UI スレッドへのイベントのProgress
マーシャリングはクラスが処理ProgressChanged
してくれるので、考える必要はありません。
ワーカーについては、必要に応じて進行状況を報告する必要があります。
public class SomeOtherClass
{
public static void DoWork(string filepath, IProgress<int> progress)
{
int currentProgress = 0;
foreach (var line in File.ReadLines(filepath))
{
DoSomethingWithLine();
currentProgress++;
progress.Report(currentProgress);
}
}
}
このアプローチのもう 1 つの利点はSomeOtherClass
、フォームについて何も知る必要がないことに注意してください。オブジェクトを提供できる人なら誰でも呼び出すことができIProgress
ます。そのメソッドを呼び出す必要がある他のフォームがある場合は、まったく変更する必要はありません。また、ある開発者がフォームを作成し、別の開発者が長時間実行されるプロセスをコーディングしている場合、DoWork
メソッドの署名に同意するだけで済みます。それ以降は、UI 担当者がすべての UI 作業を行い、非 UI 担当者がすべての非 UI 作業を行うことができ、他の人が何をしているかを心配する必要はありません。
コードが機能しない理由については、ワーカー メソッドが表示されているフォームのインスタンスにアクセスしていないことです。新しいフォームを作成し、プログレス バーを変更して、誰にも表示されません。 、そしてそれを捨てる。