当所有可观察到的异步项都完成处理后如何运行Final()?

问题描述 投票:1回答:2

为了使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?

c# linq async-await system.reactive
2个回答
1
投票

将缓冲区直接投影到您的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();

0
投票

Subscribe方法不接受异步委托,因此您的lambda是异步无效的。异步void方法不可观察或等待,并且它们的异常也不可捕获(它们未处理并导致进程崩溃)。一种解决方案是将您的批次投影到Task个批次,然后使用Merge方法返回到批次。当您单击Subscribe时,您将按照任务完成的顺序(可能不是其原始顺序)获得任务的结果。如果您对结果不感兴趣,只需调用不带参数的Subscribe

© www.soinside.com 2019 - 2024. All rights reserved.