反応(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
パラメータ - に転送する場合は、次のの呼び出し
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
を収集することを可能にすることに注意してください:は実際には基本的に、より良い方法があり、前の1
1分後に起こるはず次の繰り返し(例えば、Scan
を使用して、前の結果セットオブジェクトを次の繰り返しに渡すことができると思いました)
もう一つの小さな欠点は、全体の結果セットの次のイテレーションを経て生き続けています。問題のバージョンでは、 'バージョン'だけが必要なので、 'メッセージ'部分をガベージコレクションすることができます。 –