gpt4 book ai didi

c# - 使用 IProgress 从后台线程报告

转载 作者:太空宇宙 更新时间:2023-11-03 21:50:33 24 4
gpt4 key购买 nike

所有,我有一项昂贵的任务,我使用 async 进行/await .NET4.5 下的关键字。我通过 Progress<T> 从后台线程报告进度类(class)。

我传入的对象IProgress<T>因为类型是 ProgressInfo我将其创建为单例类,以避免在运行期间多次创建和处理此类对象的开销。类(class)是

public class ProgressInfo : IDisposable
{
public static ProgressInfo instance = null;
public WorkbookProgressInfo workbookinfo { get; set; }
public string progressMessage { get; set; }
public int progressPercentage { get; set; }

// Default constructor which has a few overloads
// for the class members above.
protected ProgressInfo()
{
}
...

// The default instance creator for the class.
// This also has overloads to allow changes to the
// class variables.
public static ProgressInfo Instance()
{
if (instance == null)
instance = new ProgressInfo();
return instance;
}
...
}

我通过方法 ReportProgress 报告进度并设置我的 IProgress<ProgressInfo>作为

IProgress<CostEngine.ProgressInfo> progressIndicator =
new Progress<CostEngine.ProgressInfo>(ReportProgress);

来自后台线程的报告通常使用全局 ProgressInfo progressInfo 完成和全局IProgress<ProgressInfo> progressIndicator喜欢

...
progressInfo = new ProgressInfo.Instance(workbookinfo, message, n);
progressIndicator.Report(progressInfo);
...

问题是对于小而快速执行的运行,ProgressInfo传递给 ReportProgress 的对象更改为 ReportProgress正在执行,所以我测试

if (progressInfo.workbookinfo != null)
{
// Do stuff <- here progressInfo.workbookinfo is changing to null!
}

如何避免此问题,同时将报告进度的费用保持在最低限度?

感谢您的宝贵时间。

最佳答案

您在此处尝试优化应用程序的错误部分。

几千个对象对于一个应用程序来说毫无意义。创建它们很可能不会成为您应用程序中的性能问题。但是,可能 的问题是 UI 的更新。如果在短时间内发生数以千计的进度报告,您将不断更新您的 UI。更新 UI 会花费时间,因此如果您遇到瓶颈,它就会出现在这里。

这里正确的做法是只报告你需要报告的内容。
例如,如果您在一分钟内发生了 60,000 次迭代,并且您报告了这些迭代中的每一次迭代,您将尝试每毫秒更新一次 UI。
你的进度条真的需要 1000 FPS 吗?我对此表示怀疑。
如果每秒只报告一次,那就太好了。但是,每秒报告一次会产生自己的开销。

我在我的应用程序中所做的是在百分比发生变化时立即报告。
这将导致最多 100 个报告,无论您实际有多少次迭代。
在上面的示例中,我将每 600 次迭代报告一次。

为了简化这一点,我实际上创建了一个名为 ProgressReporter 的类.
在它的构造函数中,它需要一个工厂委托(delegate)来创建 ProgressInfo对象和总迭代次数。
它提供了一个 ReportProgress您在当前迭代中传递的方法。
该类在内部存储先前报告的百分比,并在调用此方法时计算新的百分比。只有当不同时,它才会使用工厂委托(delegate)来创建新的 ProgressInfo并调用ReportIProgress<T> 上实例。

顺便说一句:如果您的后台操作不是几分钟而是几小时,您可以将其更改为在百分比更改时不报告,但在百分比的第一个或第二个小数点更改时报告。
这里的要点是:找到一定数量的报告,每隔几秒就给用户一个反馈。

关于c# - 使用 IProgress<T> 从后台线程报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14771182/

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