为了使UI更具响应性,我正在分批输出项目。这里的问题是在最后一个OnFinally()
完成之前调用OutputItems()
。
IObservable<IList<xx>> obs = Observable
.Interval(TimeSpan.FromSeconds(.1), Scheduler.Default)
.Zip(dirEnum.ToObservable(NewThreadScheduler.Default)
.Buffer(100), (a, b) => b)
.ObserveOn(syncContext).Finally(OnFinally);
...
obs.Subscribe(async x => await OutputItems(x));
当所有项目都缺货时,有没有办法打电话给OnFinally?
将缓冲区直接投影到您的OutPutItems上,并且不要在Subscription内部使用await
IObservable<IList<xx>> obs = Observable
.Interval(TimeSpan.FromSeconds(.1), Scheduler.Default)
.Zip(dirEnum.ToObservable(NewThreadScheduler.Default)
.Buffer(100), (a, b) => b)
.ObserveOn(syncContext).Finally(OnFinally)
.SelectManay(X=>OutputItmes().ToObservable())
.Finally(OnFinally);
...
obs.Subscribe();
Subscribe
方法不接受异步委托,因此您的lambda是异步无效的。异步void方法不可观察或等待,并且它们的异常也不可捕获(它们未处理并导致进程崩溃)。一种解决方案是将您的批次投影到Task
个批次,然后使用Merge
方法返回到批次。当您单击Subscribe
时,您将按照任务完成的顺序(可能不是其原始顺序)获得任务的结果。如果您对结果不感兴趣,只需调用不带参数的Subscribe
。