如何从长期运行中获得中间结果? - c#

以下面的类为例,并假定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