Saltar al contenido

¿Cuál es la diferencia entre Task.Start / Wait y Async / Await?

Solución:

Puedo estar olvidando algo

Usted está.

cual es la diferencia entre hacer Task.Wait y await task?

Pides tu almuerzo al camarero del restaurante. Un momento después de dar su pedido, entra un amigo, se sienta a su lado y comienza una conversación. Ahora tienes dos opciones. Puedes ignorar a tu amigo hasta que la tarea esté completa; puedes esperar hasta que llegue tu sopa y no hacer nada más mientras esperas. O puede responderle a su amigo, y cuando su amigo deje de hablar, el camarero le traerá su sopa.

Task.Wait bloques hasta que se complete la tarea; ignora a su amigo hasta que se completa la tarea. await sigue procesando mensajes en la cola de mensajes, y cuando la tarea se completa, pone en cola un mensaje que dice “retoma donde lo dejaste después de esperar”. Hablas con tu amigo y cuando hay una pausa en la conversación llega la sopa.

Para demostrar la respuesta de Eric, aquí hay un código:

public void ButtonClick(object sender, EventArgs e)
{
  Task t = new Task.Factory.StartNew(DoSomethingThatTakesTime);
  t.Wait();  
  //If you press Button2 now you won't see anything in the console 
  //until this task is complete and then the label will be updated!
  UpdateLabelToSayItsComplete();
}

public async void ButtonClick(object sender, EventArgs e)
{
  var result = Task.Factory.StartNew(DoSomethingThatTakesTime);
  await result;
  //If you press Button2 now you will see stuff in the console and 
  //when the long method returns it will update the label!
  UpdateLabelToSayItsComplete();
}

public void Button_2_Click(object sender, EventArgs e)
{
  Console.WriteLine("Button 2 Clicked");
}

private void DoSomethingThatTakesTime()
{
  Thread.Sleep(10000);
}

Este ejemplo demuestra la diferencia muy claramente. Con async / await, el hilo de llamada no se bloqueará y continuará ejecutándose.

static void Main(string[] args)
{
    WriteOutput("Program Begin");
    // DoAsTask();
    DoAsAsync();
    WriteOutput("Program End");
    Console.ReadLine();
}

static void DoAsTask()
{
    WriteOutput("1 - Starting");
    var t = Task.Factory.StartNew<int>(DoSomethingThatTakesTime);
    WriteOutput("2 - Task started");
    t.Wait();
    WriteOutput("3 - Task completed with result: " + t.Result);
}

static async Task DoAsAsync()
{
    WriteOutput("1 - Starting");
    var t = Task.Factory.StartNew<int>(DoSomethingThatTakesTime);
    WriteOutput("2 - Task started");
    var result = await t;
    WriteOutput("3 - Task completed with result: " + result);
}

static int DoSomethingThatTakesTime()
{
    WriteOutput("A - Started something");
    Thread.Sleep(1000);
    WriteOutput("B - Completed something");
    return 123;
}

static void WriteOutput(string message)
{
    Console.WriteLine("[{0}] {1}", Thread.CurrentThread.ManagedThreadId, message);
}

Salida de DoAsTask:

[1] Program Begin
[1] 1 - Starting
[1] 2 - Task started
[3] A - Started something
[3] B - Completed something
[1] 3 - Task completed with result: 123
[1] Program End

Salida DoAsAsync:

[1] Program Begin
[1] 1 - Starting
[1] 2 - Task started
[3] A - Started something
[1] Program End
[3] B - Completed something
[3] 3 - Task completed with result: 123

Actualización: ejemplo mejorado mostrando el ID del hilo en la salida.

¡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 *