Saltar al contenido

Cómo hacer que dos consultas SQL sean realmente asíncronas

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());



    

Valoraciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *