c# - tareas - espera vs Tarea. Espera-¿Interbloqueo?
multihilos en c# (1)
Wait
y await
, aunque conceptualmente similar, en realidad son completamente diferentes.
Wait
bloqueará sincrónicamente hasta que la tarea finalice. Entonces, el hilo actual está literalmente bloqueado esperando a que la tarea se complete. Como regla general, debe usar " async
hasta el final"; es decir, no bloquee el código async
. En mi blog, voy a los detalles de cómo el bloqueo en el código asíncrono causa un punto muerto .
await
esperará asíncronamente hasta que la tarea se complete. Esto significa que el método actual está "en pausa" (se captura su estado) y el método devuelve una tarea incompleta a su interlocutor. Más tarde, cuando finalice la expresión de await
, el resto del método se programará como una continuación.
También mencionó un "bloque cooperativo", por el cual supongo que quiere decir que una tarea en la que está Esperando puede ejecutarse en el hilo de espera. Hay situaciones en las que esto puede suceder, pero es una optimización. Hay muchas situaciones en las que no puede suceder, como si la tarea es para otro programador, o si ya se inició o si es una tarea que no es de código (como en el ejemplo de código: Wait
no puede ejecutar la tarea Delay
línea porque hay sin código para ello).
Puede encontrar útil mi introducción async
/ await
.
No entiendo muy bien la diferencia entre Task.Wait
y Task.Wait
.
Tengo algo similar a las siguientes funciones en un servicio ASP.NET WebAPI:
public class TestController : ApiController
{
public static async Task<string> Foo()
{
await Task.Delay(1).ConfigureAwait(false);
return "";
}
public async static Task<string> Bar()
{
return await Foo();
}
public async static Task<string> Ros()
{
return await Bar();
}
// GET api/test
public IEnumerable<string> Get()
{
Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray());
return new string[] { "value1", "value2" }; // This will never execute
}
}
Donde Get
un punto muerto.
Que podria causar esto? ¿Por qué esto no causa un problema cuando uso un bloqueo de espera en lugar de await Task.Delay
?