良い一日。
rpc 呼び出し用の TPL データフロー メッシュがあります。
2 つのねじれていないフローがあり、単純化すると次のようになります。
出力フロー:
- 出力を格納する BlockBuffer
- 出力をサーバーに送信し、送信済み ID を生成するための ActionBLock
入力フロー:
- データを受け取る while ループ
- データを解析する TransformBlock
- sendid で回答を保存する BlockBuffer
問題があります。別のスレッドから呼び出しを行うと、回答が混乱する可能性があるため、フィルタリングする必要があります。
私のrpc呼び出し:
public async Task<RpcAnswer> PerformRpcCall(Call rpccall)
{
...
_outputRpcCalls.Post(rpccall);
long uniqueId = GetUniq(); // call unique id
...
var sent = new Tuple<long, long>(uniqueId, 0);
while (_sentRpcCalls.TryReceive(u => u.Item1 == uniqueId, out sent)) ; // get generated id from send function
return await _inputAnswers.ReceiveAsync(TimeSpan.FromSeconds(30));
}
ご覧のとおり、この呼び出しの応答を判断するのに役立つ uniqueId がありますが、それをフィルタリングして待機するにはどうすればよいですか?
rpc 呼び出しとフィルターを使用した LinkedTo で作成されるバッファーの配列 (おそらく WriteOnceBlock?) を持つのは良い方法ですか?