Te damos la bienvenida a nuestro sitio, ahora vas a hallar la respuesta a lo que andabas buscando.
Solución:
Cuando usas el Result
propiedad en una tarea que aún no se ha completado, el subproceso de llamada se bloqueará hasta que se complete la operación. Eso significa en su caso que el GetAccounts
la operación debe completarse antes de la llamada a GetDeposits
empieza.
Si desea asegurarse de que estos métodos sean paralelos (incluidas las partes síncronas de uso intensivo de la CPU), debe descargar ese trabajo a otro subproceso. La forma más sencilla de hacerlo sería utilizar Task.Run
:
static void Main(string[] args)
var accountTask = Task.Run(async () => Console.WriteLine(await GetAccounts()));
var depositsTask = Task.Run(async () => Console.WriteLine(await GetDeposits()));
Task.WhenAll(accountTask, depositsTask).Wait();
Porque Main
no puede ser async
y así no puedo usar await
simplemente puede llamar a este método y esperar sincrónicamente a que se complete usando Wait
.
Aquí hay una manera de realizar dos tareas de forma asincrónica y en paralelo:
Task accountTask = GetAccounts();
Task depositsTask = GetDeposits();
int[] results = await Task.WhenAll(accountTask, depositsTask);
int accounts = results[0];
int deposits = results[1];
Generalmente prefiero usar Task.WaitAll. Para configurar este segmento de código, cambié las firmas GetAccounts/GetDeposits solo para devolver int (public static int GetAccounts()
)
Coloqué Console.WriteLine en el mismo hilo que asignó la devolución para validar que GetDeposits devuelva antes que GetAccounts, pero esto no es necesario y probablemente sea mejor moverlo después de la Task.WaitAll
private static void Main(string[] args)
int getAccountsTask = 0;
int getDepositsTask = 0;
List tasks = new List()
Task.Factory.StartNew(() =>
getAccountsTask = GetAccounts();
Console.WriteLine(getAccountsTask);
),
Task.Factory.StartNew(() =>
getDepositsTask = GetDeposits();
Console.WriteLine(getDepositsTask);
)
;
Task.WaitAll(tasks.ToArray());