Diferença entre chamada de método em C # normal e Orleans

Estou executando o Orleans no modo localHost Clustering e atualmente tenho 1 grão e um cliente.

// client code
for (int i = 0; i <num_scan; ++i)                    
{
    Console.WriteLine("client " + i);
    // the below call should have returned when first await is hit in foo()
    // but it doesn't work like that
    grain.foo(i);          
}

// grain code
async Task foo(int i)
{
     Console.WriteLine("grain "+i);
     await Task.Delay(2000);
}

A saída disso foi a seguinte:

client 0
client 1
client 2
client 3
client 4
client 5
client 6
grain 0
client 7
client 8
client 9
client 10
grain 8
grain 7
.
.

Noc # normal, a função assíncrona retornará apenas quando atingirawait. Nesse caso, a produção de grãos deveria ter sido consecutiva. Como podemos ver acima, a produção de grãos está fora de ordem. Portanto, a tarefa está retornando antes de atingir oawait declaração.Minha pergunta é qual é a diferença entre chamada de método em Orleans e C # normal.

eu viesta postagem que faz uma pergunta semelhante e as respostas sugerem que os dois casos de chamadas de método são diferentes porque chamamos uma interface em Orleans.Gostaria de saber quando a chamada de método retorna em Orleans.

PS: Eu tentei o código acima comawait grain.foo() e imprime a saída de grãos em ordem. Mas o problema com essa abordagem é: aguardar retorno somente quando todo o foo () for concluído, enquanto eu quero que retorne quando chegar à instrução aguardar.

questionAnswers(1)

yourAnswerToTheQuestion