【问题标题】: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;
      

      【讨论】:

      • 出奇的容易。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      相关资源
      最近更新 更多