es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La tarea Wait no finaliza.

Tengo un código que se ve así:

private static void Func1()
{
    Task task = Func2();
    .
    .
    .
    task.Wait();
    Log("Func1 realizado");
}

private static async Task Func2()
{
    var result = await someLib.Func3();
    Log("someLib.Func3 realizado");
}

Al ejecutar esto, veo un problema: Func1 nunca termina y no estoy seguro del motivo. someLib.Func3() sí termina, pero tampoco veo el registro de eso (“someLib.Func3 realizado”).

¿Alguien puede ayudar con esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que podría haber un problema con la forma en que se utilizan las palabras clave Task y await en este código.

    Func2 se define como un método async Task, lo que significa que se ejecutará de forma asíncrona y devolverá un objeto Task. Func1 llama a Func2 y captura el objeto Task, luego espera a que se complete con la línea task.Wait();.

    Sin embargo, dado que Func2 es un método async, es posible que siga ejecutándose después de devolver el objeto Task, y es posible que el código dentro del Task no termine realmente antes de que Func1 intente registrar “Func1 hecho”.

    Para solucionar este problema, una solución podría ser hacer que Func1 también sea un método async y usar la palabra clave await para esperar la finalización del Task devuelto por Func2. Esto aseguraría que los registros “someLib.Func3 hecho” y “Func1 hecho” se impriman en el orden correcto, después de que Func2 haya terminado:

    private static async Task Func1()
    {
        Task task = Func2();
        .
        .
        .
        await task;
        Log("Func1 hecho");
    }
    
    private static async Task Func2()
    {
        var result = await someLib.Func3();
        Log("someLib.Func3 hecho");
    }
    

    Nota: El código anterior asume que someLib.Func3() devuelve un objeto Task. Si devuelve otro tipo, se debe actualizar el código en consecuencia.

Comments are closed.