async/await呼び出しを使用して操作が実行されてもプログレスバーを更新しようとしていますが、進行状況バーが更新されている間UIがフリーズします。進行状況バーの更新中にUIがブロックされる
これは基本的にBackgroundWorkerを使用したときの非常に簡単な要件でしたが、現在この非同期/待機待ちの呼び出しを使用すると少し複雑に思えます。
まず、BackgroundWorkerのように非同期/待機使用がプログレスバーを埋めることができますか?これらの2つのアプローチの間に何か共通点がありますか?
私のUIには、プログレスバーとボタンがあります。ボタンがクリックされるとプログレスバーが更新され始めますが、UIはフリーズし、非同期/待機が「同時実行」方法。 私がBackgroundWorkedを使ってこれを行っていた場合、UIはフリーズしていませんでした。
私が間違っていることを教えてもらえますか?また、プログレスバーが更新されている間にUIを反応させ続けるために、以下のコードを変更する方法はありますか? async/awaitの使用状況が、進捗バーを更新しているときに、BackgroundWorkerのように振舞うことはできますか?以下は
は私のコードです:
private async void button1_Click(object sender, EventArgs e)
{
await CallMethodAsync();
}
private async Task CallMethodAsync()
{
this.progressBar1.Value = 0;
this.progressBar1.Maximum = 1000000;
var progressbar1 = new Progress<double>();
progressbar1.ProgressChanged += Progressbar1_ProgressChanged;
await ExecuteMethodAsync(progressbar1);
}
private async Task ExecuteMethodAsync(IProgress<double> progress = null)
{
await Task.Run(new Action(() => {
double percentComplete = 0;
bool done = false;
while (!done)
{
if (progress != null)
{
progress.Report(percentComplete);
}
percentComplete += 1;
if (percentComplete == 1000000)
{
done = true;
}
}
}));
}
private void Progressbar1_ProgressChanged(object sender, double e)
{
this.progressBar1.Increment(1);
}
バーを更新し、UIを更新するために 'this.Invoke(new Action()....'を使用しないでください。 – Crowcoder
@ Crowcoderのコメントを無視してください。は実際にはこのシナリオの現代的なイディオムです。あなたのコードの問題は、あなたが何か_actual_仕事をしていないということです。あなたはアップデートでUIスレッドをスパムしているだけです。例えば、 '1000000'ではなく' 100'に反復回数を変更し、 'while'ループに' await Task.Delay(500); 'を追加すれば、' await Task.Run( ) '(つまり、ループはラムダの代わりに' ExecuteMethodAsync() 'メソッド内にあることができます)、望むように動作します。 –