【发布时间】:2015-07-23 02:47:32
【问题描述】:
我有一个IObservable,它每秒生成一个值,然后是一个运行可能需要一些时间的代码的选择:
var events = Observable.Interval(TimeSpan.FromSeconds(1));
ssoInfoObservable = events
.Select(async e =>
{
Console.Out.WriteLine("Select : " + e);
await Task.Delay(4000);
return e;
})
.SelectMany(t => t.ToObservable())
.Subscribe(l => Console.WriteLine("Subscribe: " + l));
在我的示例中,长时间运行的操作需要 4 秒。当Select 中的代码正在运行时,我不希望从Interval 中生成另一个值。我该如何做到这一点?这可能吗?也许使用特定的IScheduler 实现?
请注意,如果没有异步代码,一切都会按照here 所述的预期工作。
这个问题和one I asked earlier非常相似,除了async/await。
【问题讨论】:
-
.ObserveOn(...)没有任何区别。.Interval(...)运算符计算每组处理程序之间的间隔(即间隔),而不是每个开始时间之间的间隔。 -
我发现我的示例代码太简单了,我更新了我的问题以反映我的实际代码。
-
这仍然受限于实际运行的线程数。我每个人都只有四个选择,然后就一直呆在那里。我会考虑一下,但你能描述一下为什么这是你的实际代码吗?您认为它可以为您解决什么问题?
-
最重要的要求是
Select不能并行运行。等待的操作可能会长时间运行(等待结果在数据库中可用)并为链的其余部分生成结果。简单的解决方案当然是同步等待等待任务的Result。实际代码非常相似,只是我在等待一些有用的东西。 -
你为什么要像
await这样混合 Observables? Observables 实现了将您的工作推送到后台线程的目的,从而释放 UI(或主线程)以响应其他代码。混入await有点像“双重浸渍”。
标签: c# async-await system.reactive throttling