在等待异步操作时更新进度条

问题描述 投票:0回答:2

我在等待异步 IO 操作时尝试更新进度条。下面的代码就是这样做的。

Task<string> io = SomeOperationAsync();

while(!io.IsComplete)
{
    progressBar.Value = value // add some progress;
    await Task.Delay(TimeSpan.FromMilliseconds(200));
}    

string result = await io;

这很好用。进度条填满很顺利。

但是如您所见,我将每 200 毫秒检查一次是否完成,而不是真正等待它。我最终可能会等待 200 毫秒太久。

有没有更好的实现方式,让我的方法在IO操作完成后立即返回?

c# .net asynchronous async-await
2个回答
1
投票

您可以使用 .WhenAny() 在任何任务完成时返回。如果主要任务在延迟之前完成,对代码的小重构将返回。

Task<string> io = SomeOperationAsync();

while(!io.IsComplete)
{
    progressBar.Value = value // add some progress;
    await Task.WhenAny(io, Task.Delay(TimeSpan.FromMilliseconds(200)));
}    

string result = await io;

0
投票

如果可以,让

SomeOperationAsync
直接使用标准进度报告模式报告其进度。然后,在等待呼叫时报告进度非常简单:

var progress = new Progress<TValue>(value => progressBar.Value = value);
string result = await SomeOperationAsync(progress);
© www.soinside.com 2019 - 2024. All rights reserved.