以下面的类为例,并假定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观测值
我是RX的新手,但是我喜欢可以轻松地在UI线程上进行事件处理的想法。我想知道这是否是过大的,并且不符合预期,因为它实际上不是完整的数据流,而是每个可观察到的结果。另一方面,尽管和事件订阅一样,订阅和取消订阅也是如此麻烦。
有什么提示吗?
c#大神给出的解决方案
解决该问题的Rx方法是定义一个可观察到的感冒,如下所示:
IObservable<Result> Calculate(IScheduler scheduler)
{
return Observable.Create<Result>(observer =>
scheduler.Schedule(() =>
{
observer.OnNext(longPartialCalculation());
observer.OnNext(morePartialCalculation());
observer.OnNext(moreWork());
observer.OnCompleted();
}));
}
// Depending upon your needs, you could use inheritance as follows:
public abstract class Result { ... }
public class MidResult1 : Result { ... }
public class MidResult2 : Result { ... }
public class FinalResultObject : Result { ... }
您还可以定义一个重载,该重载指定默认的调度程序,例如,如果要引入并发,则为ThreadPoolScheduler
,否则为CurrentThreadScheduler
。
要使用此方法返回的可观察对象,只需使用观察者调用Subscribe
即可。您可以提供一个OnNext
处理程序来检查每个Result
对象的到达,并提供一个OnCompleted
处理程序来处理完成。如果需要,还可以提供一个OnError
处理程序来处理Exception
。
(编辑:请注意,尽管我的示例未调用OnError
。)
如果要确保所有这些处理程序都在UI线程上执行,并且已将诸如ThreadPoolScheduler
这样的并发引入调度程序传递给Calculate
方法,则还可以应用ObserveOn
运算符(或在基于XAML的平台上为ObserveOnDispatcher
)以封送所有到UI线程的通知以进行观察。
algo.Calculate(ThreadPoolScheduler.Instance)
.ObserveOnDispatcher()
.Subscribe(OnNextResult, OnCompleted);
注意,Rx的主要好处之一是查询能力。例如,一个简单的过滤器:
algo.Calculate(ThreadPoolScheduler.Instance)
.Where(result => result.HasRequiredState)
.ObserveOnDispatcher()
.Subscribe(result => handle(result.RequiredState));
System.out.printf不打印整数参数 - java我是Java编程的新手,无法从另一个类返回方法。这两个类都可以编译并成功运行。我可以从一个类中调用一个简单的int,但是当我想计算用户输入的两个输入整数时,我只会得到一个空格。这是我的计算课class calculations { public final int AGE = 53; public int numbers(int num1, int num2…
SelectMany等待和结果排序 - c#在Deep Dive into Rx SelectMany文章中,作者在最后的注释中提到了以下内容; 注意:为缓解订购问题,SelectMany()随附了一个 重载,它带有签名Func<TSource, int, Task<TResult>>的选择器。有人可以启发我如何工作吗? c#大神给出的解决方案 在上述重载的元数据描述中,它表示…
LeetCode题解计算机为什么是基于二进制的?可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制
LeetCode题解黑白圆盘一个圆盘被涂上了黑白二色,两种颜色各占一个半圆。圆盘以一个未知的速度、按一个未知的方向旋转。你有一种特殊的相机可以让你即时观察到圆上的一个点的颜色。你需要多少个相机才能确定圆盘旋转的方向?题解:可以用一个相机即可
LeetCode题解圆上任取三点构成锐角三角形的概率来自字节跳动的一道几何题题解:1/4