У меня есть три зерна (A, B и C), выполняющие разные задания в конвейере. GrainA передаст результат зерну B, а зерно B передаст результат зерну C. Я хочу гарантировать последовательную отправку сообщений между последовательными зернами, что может быть достигнуто ниже.
// client code
foreach(var i in list)
{
await grainA.job(i);
}
//grain A code
async Task job(var i)
{
DoSomeWorkA(i);
await grainB.job(i);
}
//grain B code
async Task job(var i)
{
DoSomeWorkB(i);
await grainC.job(i);
}
//grain C code
async Task job(var i)
{
DoSomeWorkC(i);
Console.WriteLine(i);
}
Однако проблема с этим кодом заключается в отсутствии конвейерной обработки. зерну A дается чистый объект только тогда, когда текущий объект проходит через все зерна B и зерна C (из-за оператора ожидания). Один из способов получить конвейерную обработку — не использовать await, а напрямую отправлять объекты один за другим. Однако это приводит к доставке не по порядку, как описано в этот пост.
Я хочу, чтобы выполнение было полностью конвейерным, что означает, что grinA переходит к следующему заданию, когда grinB получает результат от grinA. Однако порядок сообщений также важен, поскольку я отправляю некоторые управляющие сообщения. Как это сделать в Орлеане?