c# tareas - espera vs Tarea.Espera-¿Interbloqueo?




en ejecutar (2)

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 ?


No existe un concepto como un entero con relleno. ¿Cuántas piernas tienes - 2, 02 o 002? Ellos son el mismo número. De hecho, incluso la parte "2" no es realmente parte del número, solo es relevante en la representación decimal.

Si necesita relleno, eso sugiere que está hablando de la representación textual de un número ... es decir, una cadena.

Puede lograr eso utilizando las opciones de formato de cadenas, por ejemplo

string text = value.ToString("0000000");

o

string text = value.ToString("D7");




c# task-parallel-library deadlock async-await