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