Async/await tâches et WaitHandle

Dire que j'ai 10N articles(j'ai besoin de les récupérer via le protocole http), dans le code de N Tâches sont lancés pour obtenir les données, chaque tâche prend 10 éléments dans la séquence. J'ai mis les éléments dans un ConcurrentQueue<Item>. Après cela, les éléments sont traités dans un thread méthode dangereuse, un par un.

async Task<Item> GetItemAsync()
{
    //fetch one item from the internet
}

async Task DoWork()
{
    var tasks = new List<Task>();
    var items = new ConcurrentQueue<Item>();
    var handles = new List<ManualResetEvent>();

    for i 1 -> N
    {
        var handle = new ManualResetEvent(false);
        handles.Add(handle);

        tasks.Add(Task.Factory.StartNew(async delegate
        {
            for j 1 -> 10
            {
                var item = await GetItemAsync();
                items.Enqueue(item);
            }
            handle.Set();
        });
    }

    //begin to process the items when any handle is set
    WaitHandle.WaitAny(handles);

    while(true)
    {
         if (all handles are set && items collection is empty) //***
           break; 
         //in another word: all tasks are really completed

         while(items.TryDequeue(out item))          
         {
              AThreadUnsafeMethod(item);    //process items one by one
         }
    }
}

Je ne sais pas ce que si la condition peut être placé dans la déclaration marqué ***. Je ne peux pas utiliser Task.IsCompleted bien ici, parce que je utiliser await dans la tâche, de sorte que la tâche est terminée très bientôt. Et un bool[] qui indique si la tâche est exécutée à la fin à l'air vraiment très laid, parce que je pense que ManualResetEvent peut faire le même travail. Quelqu'un peut-il me donner une suggestion?

OriginalL'auteur Cheng Chen | 2012-08-24