我对 Rx 相当陌生,并且无法找到解决问题的方法。我正在使用 Rx 通过客户端库开始下载。目前它看起来像:
private void DownloadStuff(string descriptor, Action<Stuff> stuffAction)
{
this.stuffDownloader.GetStuffObservable(descriptor).Subscribe(x => stuffAction(x))
}
其中 stuffDownloader 是客户端库中定义的下载逻辑的包装器。但是我遇到了一个问题,就是调用DownloadStuff太多,导致下载很多,系统不堪重负。现在我想做的是
private void DownloadStuff(string descriptor, Action<Stuff> stuffAction)
{
this.stuffDownloader.GetStuffObservable(descriptor)
.SlowSubscribe(TimeSpan.FromMilliSeconds(50))
.Subscribe(x => stuffAction(x))
}
其中,SlowSubscribe 是 Rx 操作的某种组合,仅在某个时间间隔订阅。
通常我只会将这些 DownloadStuff 调用放在一个队列中,并在一段时间内将它们拉出来,但我最近一直在尝试通过 Rx 做更多事情。我想到了三个解决方案:
- 此功能存在并且可以在订阅端完成。
- 这是可能的,但下载器的基础设施不正确,应该改变(即 stuffDownloader 需要表现不同)
- 这不应该用 Rx 来做,用另一种方式来做。
我想到#2 可以通过将描述符的 IObservable 传递给客户端库并以某种方式减慢描述符进入 Observable 的速度。