我想更好地瞭解如何從異步操作更新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'操作符,並且會同步運行,考慮使用'await'操作符來等待非阻塞API調用或'await Task.Run(.. )'在後臺線程上執行CPU綁定的工作。「*。你做錯的事情是導致編譯器警告,並且警告甚至會告訴你如何解決它。 –
此外,你不應該混合[ContinueWith和異步](https://blog.stephencleary.com/2013/10/continuewith-is-dangerous-too.html)(但這不會導致你的問題) –
檢出https ://stackoverflow.com/questions/11500563/winform-multithreading-use-backgroundworker-or-not –