- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所有,我有一项昂贵的任务,我使用 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
并调用Report
在 IProgress<T>
上实例。
顺便说一句:如果您的后台操作不是几分钟而是几小时,您可以将其更改为在百分比更改时不报告,但在百分比的第一个或第二个小数点更改时报告。
这里的要点是:找到一定数量的报告,每隔几秒就给用户一个反馈。
关于c# - 使用 IProgress<T> 从后台线程报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14771182/
我对这个错误很困惑: Cannot implicitly convert type 'System.Func [c:\Program Files (x86)\Reference Assemblies\
考虑这段代码: pub trait Hello { fn hello(&self); } impl Hello for Any { fn hello(&self) {
问题很简单。是否可以构造这样一个类型 T,对于它下面的两个变量声明会产生不同的结果? T t1 = {}; T t2{}; 我已经研究 cppreference 和标准一个多小时了,我了解以下内容:
Intellij idea 给我这个错误:“Compare (T, T) in Comparator cannot be applied to (T, T)” 对于以下代码: public class
任何人都可以告诉我 : n\t\t\t\t\n\t\t\t 在以下来自和 dwr 服务的响应中的含义和用途是什么. \r\n\t\t\t \r\n\t\t\t
让 T 成为一个 C++ 类。 下面三个指令在行为上有什么区别吗? T a; T a(); T a = T(); T 为不带参数的构造函数提供了显式定义这一事实是否对问题有任何改变? 后续问题:如果
Rust中的智能指针是什么 智能指针(smart pointers)是一类数据结构,是拥有数据所有权和额外功能的指针。是指针的进一步发展 指针(pointer)是一个包含内存地
比如我有一个 vector vector > v={{true,1},{true,2},{false,3},{false,4},{false,5},{true,6},{false,7},{true,8
我有一个来自 .xls 电子表格的数据框,我打印了 print(df.columns.values) 列,输出包含一个名为:Poll Responses\n\t\t\t\t\t。 我查看了 Excel
This question already has answers here: What are good reasons for choosing invariance in an API like
指针类型作为类型前缀与在类型前加斜杠作为后缀有什么区别。斜线到底是什么意思? 最佳答案 语法 T/~ 和 T/& 基本上已被弃用(我什至不确定编译器是否仍然接受它)。在向新向量方案过渡的初始阶段,[T
我正在尝试找到一种方法来获取模板参数的基类。 考虑以下类: template class Foo { public: Foo(){}; ~Foo(){};
这是一个让我感到困惑的小问题。我不知道如何描述它,所以只看下面的代码: struct B { B() {} B(B&) { std::cout ::value #include
为什么有 T::T(T&) 而 T::T(const T&) 更适合 copy ? (大概是用来实现move语义的???) 原始描述(被melpomene证明是错误的): 在C++11中,支持了一种新
在 Java 7 中使用 eclipse 4.2 并尝试实现 List 接口(interface)的以下方法时,我收到了警告。 public T[] toArray(T[] a) { ret
假设有三个函数: def foo[T](a:T, b:T): T = a def test1 = foo(1, "2") def test2 = foo(List(), ListBuffer()) 虽
我对柯里化(Currying)和非柯里化(Currying)泛型函数之间类型检查的差异有点困惑: scala> def x[T](a: T, b: T) = (a == b) x: [T](a: T,
考虑一个类A,我如何编写一个具有与相同行为的模板 A& pretty(A& x) { /* make x pretty */ return x; } A pretty(A&& x) {
Eclipse 表示由于泛型类型橡皮擦,类型参数不允许使用 instanceof 操作。 我同意在运行时不会保留任何类型信息。但是请考虑以下类的通用声明: class SomeClass{ T
在 C++14 中: 对于任何整数或枚举类型 T 以及对于任何表达式 expr: 有没有区别: struct S { T t { expr }; }; 和 struct S { T t = { exp
我是一名优秀的程序员,十分优秀!