リアクティブエクステンションを学んでいます。このようなタスクにマッチするかどうかを調べようとしています。リアクティブエクステンションでリクエストのバッチを処理する
私は、作業の単位として要求のバッチを処理し、すべての要求が完了したときにコールバックを呼び出すProcess()メソッドを持っています。
ここで重要なことは、実装ごとに各要求が同期または非同期のいずれかのコールバックを呼び出すことであり、バッチプロセッサは両方を処理できる必要があります。
バッチプロセッサからスレッドが開始されない場合、必要に応じて新しいスレッド(またはその他の非同期実行)が要求ハンドラ内から開始されます。これがrxのユースケースと一致するかどうかはわかりません。
public void Process(ICollection<IRequest> requests, Action<List<IResponse>> onCompleted)
{
IUnitOfWork uow = null;
try
{
uow = unitOfWorkFactory.Create();
var responses = new List<IResponse>();
var outstandingRequests = requests.Count;
foreach (var request in requests)
{
var correlationId = request.CorrelationId;
Action<IResponse> requestCallback = response =>
{
response.CorrelationId = correlationId;
responses.Add(response);
outstandingRequests--;
if (outstandingRequests != 0)
return;
uow.Commit();
onCompleted(responses);
};
requestProcessor.Process(request, requestCallback);
}
}
catch(Exception)
{
if (uow != null)
uow.Rollback();
}
if (uow != null)
uow.Commit();
}
どのようにあなたは、この使用してRXを実装します。このような
私の現在の作業コードルックス(ほぼ)?それは妥当ですか?
まだ返されていない非同期要求があっても、作業単位は同期してコミットされることに注意してください。あなたが同期または非同期の結果を返すことが自由だとして
これは非常に、実際に役立ちます!非常に精巧な答えをありがとう。私がここで本当に頭を上げることができない唯一のことは、すべての要求が応答されたときにどうすれば "何か"をすることができるかということです。どのように私は言う:と今すべての要求が応答されると、これらの要求/応答のペアでこれらのメソッドを呼び出す...私は "rqrps" observableを購読しようとした、リストの応答を収集し、メソッドは完了しましたが、成功しませんでした(これ以降のリストで回答を収集するのはちょっと奇妙です)。私は本当にそれについてのいくつかのヒントを感謝しています:) – asgerhallas
doh! ...間違った過負荷と呼ばれる:) – asgerhallas
@asgerhallas - すべてのペアが戻ってくるのを待つ必要はありません。さもなければ '.ToArray()' observable演算子を見ると、 'IObservable'が 'IObservable 'に変わります。n個の値を観測可能にして、あなたのニーズに合った完璧なオペレータのように聞こえます。 –
Enigmativity