【问题标题】:Updating a progress bar while awaiting async operation在等待异步操作时更新进度条
【发布时间】:2023-02-23 03:17:44
【问题描述】:
我在等待异步 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
【解决方案1】:
如果可以,让SomeOperationAsync直接使用the standard progress reporting pattern报告其进度。然后,在等待呼叫时报告进度非常简单:
var progress = new Progress<TValue>(value => progressBar.Value = value);
string result = await SomeOperationAsync(progress);
【解决方案2】:
您可以使用 .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;