Уже есть хороший вопрос об опросе базы данных с использованием Reactive (опрос базы данных с помощью 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
для передачи предыдущего объекта набора результатов в следующую итерацию).