私は非同期操作からWindowsフォームプログレスバーを更新する方法を理解していますが、予期しない動作が発生しています。非同期メソッドから進行状況バーを更新します。
基本的には、進捗バーを更新するためにクリックした後、プログレスバーが100%更新された後に0に戻す必要があるボタンがあります。
これは私のコードです:
private async void button1_Click(object sender, EventArgs e)
{
await CallMethodAsync().ContinueWith((prevTask) =>
{
prevTask.Wait();
progressBar1.Invoke(new Action(() => { progressBar1.Value = 0; }));
});
}
private static async Task ExecuteMethodAsync(IProgress<double> progress = null)
{
double percentComplete = 0;
bool done = false;
while (!done)
{
if (progress != null)
{
progress.Report(percentComplete);
}
percentComplete += 10;
if(percentComplete == 100)
{
done = true;
}
}
}
private async Task CallMethodAsync()
{
var progress = new Progress<double>();
progress.ProgressChanged += (sender, args) => { progressBar1.Increment(10); };
await ExecuteMethodAsync(progress);
}
は、プログレスバーが、私は「待って()」プログレスバーの値を更新する必要があり、操作を呼び出す場合でも、全く更新されていないこの実装を持ちます。
私はこのコードの一部削除した場合:
progressBar1.Invoke(new Action(() => { progressBar1.Value = 0; }));
をプログレスバーが更新されますが、それはそのようなすべての時間のまま、と私はそのように、それが完全に充填した後に0に戻ってそれを設定したいですもう一度ボタンをクリックすると再び更新できます。
誰かが私に間違っていることを説明してもらえますか?
コンパイル警告* CS1998 C#この非同期メソッドには 'await'演算子がなく、同期的に実行されます。 。) 'バックグラウンドスレッドでCPUバインドされた作業を行う。あなたが間違っていることは、そのコンパイラの警告を引き起こし、警告はそれを修正する方法を指示します。 –
また、[ContinueWithとasync](https://blog.stephencleary.com/2013/10/continuewith-is-dangerous-too.html)を混ぜ合わせてはいけません。(これで問題は発生しません) –
https ://stackoverflow.com/questions/11500563/winform-multithreading-use-backgroundworker-or-not –