Domanda

Ho qualche semplice codice in cui il filo conduttore è la creazione di una nuova attività. Il compito a sua volta genera molteplici attività figlio. Il filo conduttore fa un 'attesa' sulla attività principale. Sto osservando che non ottengo la stessa uscita su più piste del programma. Nel codice qui sotto sto stampando il valore della variabile di iterazione in ogni attività, ma tra le varie piste solo sottoinsiemi vengono stampati fuori. Capisco che l'esecuzione non è ordinato, ma avrebbe ancora essere completo nel senso che io mi aspetto 100 numeri per ottenere stampati (in nessun ordine particolare). Non chiamare Wait non aspettare che tutte le attività figlio per completare? Io corro VS2010 Team System Beta1

 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());
    }
È stato utile?

Soluzione

MSDN , avete bisogno di più in attesa o altro la sincronizzazione, e cito: """ Quando si aspetta su un compito, è implicitamente aspettare tutti figli di questo compito, a meno che quei bambini sono stati creati utilizzando l'opzione DetachedFromParent. Eventuali bambini staccati devono essere serviti separatamente. "" "

Qui, principali attende il genitore, ma dal momento che i figli di genitori sono stati effettivamente creati come indipendente, che fa non fare principale implicitamente attendere sui bambini e, in modo principale (e di conseguenza l'intero processo) può e spesso terminerà prima di qualche compito bambino ha avuto la possibilità di eseguire.

Altri suggerimenti

Il mio errore: ho usato per sbaglio l'opzione DetachedFromParent durante la creazione dei bambini

 Task.Factory.StartNew(() => 
            {
               Write(localInt);
            }, TaskCreationOptions.DetachedFromParent);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top