Pregunta

Tengo algo de código sencillo en el que el hilo principal es la creación de una nueva tarea. La tarea a su vez genera múltiples tareas secundarias. El hilo principal hace una 'espera' en la tarea padre. Estoy observando que no consigo el mismo resultado a través de múltiples ejecuciones del programa. En el siguiente código que estoy imprimiendo el valor de la variable de iteración en cada tarea, pero a través de diferentes carreras sólo subconjuntos se imprimen a cabo. Yo entiendo que la ejecución no está ordenado pero aún tendría que ser completo en que estoy esperando 100 números para obtener impreso (en ningún orden en particular). No llamar Esperar no esperar a que todas las tareas para completar niño? Estoy corriendo VS2010 equipo Beta1 sistema

 static void Main(string[] args)
    {
        Console.WriteLine("Main executing on ThreadID:- " + Thread.CurrentThread.ManagedThreadId.ToString());

        var task = Task.Factory.StartNew(WriteNumbers);
        task.Wait();

    }

    private static void WriteNumbers()
    {
        Console.WriteLine("WriteNumbers executing on ThreadID:- " + Thread.CurrentThread.ManagedThreadId.ToString());
        for (int i = 0; i < 100; i++)
        {
            int localInt = i;
            Task.Factory.StartNew(() => 
                {
                   Write(localInt);
                }, TaskCreationOptions.DetachedFromParent);
        }
    }

    private static void Write(int i)
    {            
        Console.WriteLine("Worker Thread executing on ThreadID:-" + Thread.CurrentThread.ManagedThreadId.ToString() + " Value:" + i.ToString());
    }
¿Fue útil?

Solución

MSDN , se necesita más esperando u otro sincronización, y cito: """ Cuando se espera en una tarea, de manera implícita espera en todos los niños de esa tarea, a menos que esos niños fueron creados mediante la opción DetachedFromParent. Cualquier niño unifamiliares deben ser atendidos en forma separada. "" "

A continuación, los principales esperas de los padres, pero ya que los niños de los padres fueron de hecho creadas como individual, que hace no make principal implícitamente esperar en los niños y, por lo principal (y por lo tanto todo el proceso) puede y con frecuencia se terminará antes de alguna tarea niño ha tenido la oportunidad de correr.

Otros consejos

Mi error: He utilizado accidentalmente la opción DetachedFromParent al crear los niños

 Task.Factory.StartNew(() => 
            {
               Write(localInt);
            }, TaskCreationOptions.DetachedFromParent);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top