Добрый день.
У меня есть сетка потока данных TPL для вызовов rpc
Он имеет два несвязанных потока, которые в упрощенном виде выглядят так:
Выходной поток:
- BlockBuffer для хранения вывода
- ActionBlock для отправки вывода на сервер и создания отправленного идентификатора
И входной поток:
- цикл while для получения данных
- TransformBlock для анализа данных
- BlockBuffer для сохранения ответа с помощью sentid
есть проблема: когда я звоню из отдельных потоков, я могу путаться с ответами, поэтому мне нужно его отфильтровать.
мой вызов 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));
}
как видите, у меня есть уникальный идентификатор, который может помочь мне определить ответ на этот вызов, но как я могу отфильтровать его и дождаться его?
Это хороший способ иметь некоторый массив буферов (может быть, WriteOnceBlock?), Который будет создан в вызове rpc и LinkedTo с фильтром?