已经有一个关于使用 Reactive 进行数据库轮询的好问题(Database polling with Reactive Extensions)
我有一个类似的问题,但有一个转折:我需要将上一个结果中的值提供给下一个请求。基本上,我想对此进行投票:
interface ResultSet<T>
{
int? CurrentAsOfHandle {get;}
IList<T> Results {get;}
}
Task<ResultSet<T>> GetNewResultsAsync<T>(int? previousRequestHandle);
这个想法是返回自上次请求以来的所有新项目
- 每分钟我都想打电话
GetNewResultsAsync
- 我想将
CurrentAsOf
上一次调用中的作为参数传递给previousRequest
参数 - 下一个呼叫
GetNewResultsAsync
实际上应该在上一个呼叫之后一分钟发生
基本上,有没有比以下更好的方法:
return Observable.Create<IMessage>(async (observer, cancellationToken) =>
{
int? currentVersion = null;
while (!cancellationToken.IsCancellationRequested)
{
MessageResultSet messageResultSet = await ReadLatestMessagesAsync(currentVersion);
currentVersion = messageResultSet.CurrentVersionHandle;
foreach (IMessage resultMessage in messageResultSet.Messages)
observer.OnNext(resultMessage);
await Task.Delay(TimeSpan.FromMinutes(1), cancellationToken);
}
});
另请注意,此版本允许messageResultSet
在等待下一次迭代时收集 (例如,我想也许我可以使用Scan
将先前的结果集对象传递给下一次迭代)