c# - IProgress<T> 多久报告一次进度

标签 c# async-await progress

使用 IProgress<T> 时报告进度,应该是

  • 代码报告进度的责任是将其进度报告的频率限制在“合理”的范围内,-或-
  • 具体执行责任IProgress<T>请注意,进度报告的频率可能高于其呈现此进度的合理方式。

问题的上下文是我有一些使用 IProgress<T> 的代码报告进度,并且它以非常高的速度报告进度。我想用 UI 进度条显示进度。如果我使用提供的 Progress<T>实现(将进度发布到 UI SyncronizationContext),然后它会导致 UI 无响应(即发送到消息队列的消息太多,用户甚至无法单击对话框上的“取消”按钮)。

所以,

  • 我可以通过减少报告来解决这个问题,但是如果我有一个 IProgress<T> 怎么办?只是将进度写入日志文件的实现(并且可以处理高报告频率)。 -或者-
  • 我可以通过创建自己的特定 IProgress<T> 来解决这个问题实现限制了我处理/报告进度的频率。据推测,此实现将记录非 UI 线程上的最新进度,然后(可能)UI 将根据计时器进行更新。

最佳答案

编写一个装饰器来限制调用。这样您就可以将节流逻辑与实际报告分开,您可以将其用于任何其他 IProgress<T>实现。

当你想限制进度报告时使用这个装饰器。用下面类的实例简单地包装你的进度报告器。

我已将节流逻辑留给您。您可以使其基于时间、通话量或其他一些标准。

public class ProgressThrottler<T>: IProgress<T> {
    public ProgressThrottler(IProgress<T> progress) {
        _progress = progress ?? throw new ArgumentNullException("progress");
    }

    private readonly IProgress<T> _progress;

    public void Report(T value) {
        // Throttles the amount of calls
        bool reportProgressAfterThrottling = ...;

        if (reportProgressAfterThrottling) {
            _progress.Report(value);
        }
    }
}

关于c# - IProgress<T> 多久报告一次进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19661194/

相关文章:

javascript - 如何在 React 中分离多个进度百分比

c# - 如何在应用程序启动之间保留对象列表

c# - 我应该如何从在 Linux 中的单声道上运行的 C# 应用程序访问 Active Directory?

c# - 如何以编程方式更改 C# 中 ProgressTemplate 内的跨度文本?

c# - 在 WPF 应用程序中以编程方式从 XAML 文件加载矢量图形

javascript - 异步/等待隐式返回 promise ?

windows - Grep ffmpeg 时间/持续时间以获取进度流?

ios - UITextField 像 safari 一样有进展

c# - 如何正确编写自定义任务返回方法

c# - 对于频繁发生的事件,等待速度太慢;异步方法可以忽略取消吗?