OnCompleted()
не принимает аргументов, которые, очевидно, не могут быть изменены.
У вас есть несколько вариантов:
Вы можете создать класс полезной нагрузки, в котором будут и процесс, и конечная полезная нагрузка. class OrderProgress { double Process; OrderResult Result; }
Вы можете выставить другую тему, Progress
, на которую вы можете подписаться в дополнение к ObservableOrder
.
Если вы хотите оставить Start
реентерабельным, вы можете заставить его вернуть объект, который выставляет как Progress
, так и OrderProgress
наблюдаемые.
Редактировать: Включая пример кода (моего второго варианта):
private void Test()
{
var order = new Order();
order.ObservableProgress.Subscribe(
prog => Console.WriteLine("Order progress " + prog.ToString()
);
order.ObservableOrder.Subscribe(
ord => Console.WriteLine("Order progress"),
ex => Console.WriteLine("Paid error " + ex.Message),
() => Console.WriteLine("Paid oncompleted")
);
order.Start();
}
public class Order
{
private readonly Subject<Order> _subject = new Subject<Order>();
private readonly Subject<double> _progressSubject = new Subject<double>();
public IObservable<Order> ObservableOrder
{
get { return _subject.AsObservable(); }
}
public IObservable<double> ObservableProgress
{
get { return _progressSubject.AsObservable(); }
}
public void RaiseError() {
_subject.OnError(new Exception("test exception"));
}
public void RaiseCompleted() {
_subject.OnNext(this);
_subject.OnCompleted();
_progressSubject.OnCompleted();
}
public void RaiseProgress(double progress) {
_progressSubject.OnNext(progress);
}
public void Start() {
for (int i = 0; i < 5; i++)
this.RaiseProgress((double)i / 5D);
this.RaiseError(); // either error is raised
this.RaiseCompleted(); // or completed is raised
}
}