Diferencia entre la llamada al método en C # normal y Orleans

Estoy ejecutando Orleans en modo LocalHost Clustering y actualmente tengo 1 grano y un 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);
}

El resultado de esto fue el siguiente:

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
.
.

Innormal C #, la función asíncrona regresa solo cuando golpeaawait. En ese caso, la producción de granos debería haber sido consecutiva. Como podemos ver arriba, las salidas de grano están fuera de servicio. Entonces, la tarea regresa antes de presionar laawait declaración. @Mi pregunta es cuál es la diferencia entre la llamada al método en Orleans y C # normal.

Yo viesta publicació que hace una pregunta similar y las respuestas sugieren que los dos casos de llamadas a métodos son diferentes porque llamamos a una interfaz en Orleans. @e gustaría saber cuándo regresa la llamada al método en Orleans.

PD Probé el código anterior conawait grain.foo() e imprime la salida de grano en orden. Pero el problema con ese enfoque es que esperar solo vuelve cuando se completa todo el foo (), mientras que quiero que vuelva cuando llegue a la declaración de espera.

Respuestas a la pregunta(1)

Su respuesta a la pregunta