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.