Solución:
Puedo estar olvidando algo
Usted está.
cual es la diferencia entre hacer
Task.Wait
yawait 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.