我在等待异步 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操作完成后立即返回?
您可以使用 .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;
如果可以,让
SomeOperationAsync
直接使用标准进度报告模式报告其进度。然后,在等待呼叫时报告进度非常简单:
var progress = new Progress<TValue>(value => progressBar.Value = value);
string result = await SomeOperationAsync(progress);