【发布时间】:2015-01-23 05:14:09
【问题描述】:
参加以下课程,假设Calculate 是一个计算密集型函数。
class Algorithm
{
FinalResultObject Calculate()
{
longPartialCalculation();
//signal to caller that that part is ready of type MidResult1
morePartialCalculation();
//signal more is ready, different type of MidResult2
moreWork();
return finalResult;
}
}
现在假设,只要用户准备好,中间结果就需要显示给用户。
我看到的选项是:
使用单独的事件发出信号
使用构造函数注入来注入正在调用其方法的处理程序类
使用 RX observables
我是 RX 新手,但我喜欢我可以轻松地在 UI 线程上进行事件处理的想法。我想知道这是否是矫枉过正而不是预期的,因为它不是真正的整个数据流,而只是每个可观察的一个结果。另一方面,虽然就像事件订阅和取消订阅一样,看起来很麻烦。
有什么提示吗?
【问题讨论】:
-
除非这个工人的寿命比它报告的进度要长得多(几乎永远不会如此),否则没有必要取消订阅事件;持有事件的对象应该在任何添加处理程序的对象之前死亡。
-
我不确定我是否理解这个问题,但是除了提供特殊的进度报告事件之外,您还可以轮询正在进行的操作,那么您不需要事件、订阅和取消订阅。
-
我对这个问题的理解不是如何从一些封闭的操作中获得进展,而是如何报告计算提供的进展。这只是一个如何公开进度通知的问题。
-
@Servy 所以你建议走的路是通过事件? UI 肯定会比
Algorithm类更长寿。但由于Calculate()不会在 UI 线程上运行,我需要将事件处理程序引导回调度程序。 -
@所有人:我实际上在谷歌上搜索这个问题时遇到了麻烦。似乎我无法真正找到我想知道的问题的真实世界样本,因为它感觉很普遍。我需要封装
Algorithm类,因为它需要可互换。中间步骤没有特定的顺序,这就是为什么我不能公开几个方法,比如CalculationStep1()等等。
标签: c# events dependency-injection system.reactive