gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:10:09 24 4
gpt4 key购买 nike

使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com