已經有使用無(Database polling with Reactive Extensions)如何使用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
以前的結果集對象傳遞到下一個迭代)
另一個小缺點是整個結果集住在通過下一次迭代。問題中的版本允許'消息'部分被垃圾收集,因爲我們只需要'版本'。 –