2013-08-01 2 views
1

Salut, je me suis attaché avec Task.Factory.StartNew. Tout comme je pense avoir compris l'idée, quelqu'un m'a suggéré d'écrire le code suivant;Task.Factory.StartNew - confus au sujet de la piscine

bool exitLoop = false;     
while (!exitLoop) 
{ 
    exitLoop = true; 
    var messages = Queue.GetMessages(20); 
    foreach (var message in messages)      
    { 
     exitLoop = false; 
     Task.Factory.StartNew(() => 
        { 
         DeliverMessage(message); 
        }); 
    } 
} 

En théorie, cela va drainer une file d'attente, 20 messages à la fois, en essayant de creat une tâche pour chaque message dans la file d'attente. Donc, si nous avions 1000 messages dans la file d'attente, nous aurions 25 tâches en un instant et tout se passerait dans tous les msgs. Je pensais déjà avoir compris cela, je pensais que StartNew bloquerait une fois qu'il n'y avait plus d'entrées - dans les vieux jours cela aurait été ~ 25. Mais étant donné que c'est .net 4.5 que je suis maintenant sous l'impression que la limite supérieure pour une piscine est maintenant assez haute. Ce qui m'intrigue, c'est que j'aurais supposé que cela allait inonder le pool de nouvelles tâches et commencer à bloquer, c'est-à-dire en un instant, j'ai maintenant 1000 tâches en cours. Donc, si la limite de la piscine est maintenant à peine une limite, pourquoi ne vois-je pas 1000 tâches? [Edit] ok, donc ce que je vois, c'est que 1000 tâches sont mises en file d'attente, plutôt que d'être en cours d'exécution. Alors, comment puis-je déterminer le nombre de tâches en cours d'exécution/runnable?

+0

Task.Factory exécute toutes les tâches dans sa file d'attente immédiatement ou lorsque le planificateur trouve des unités d'exécution disponibles. En outre, vous devez passer un jeton d'annulation lors de l'utilisation de la méthode StartNew pour éviter la fin inattendue des tâches provoquées par le GC. Je ne suis pas sûr de savoir comment déterminer le nombre de tâches exécutables/runnables. –

+0

Aussi, j'ai oublié de mentionner, le pool de tâches ne verrouillera rien, c'est pourquoi il y a un planificateur de tâches. –

+0

Voulez-vous connaître le nombre de tâches en cours ou si des tâches sont restées inachevées? – Linky

Répondre

0

Je sais que cela fait pas mal de temps après votre publication, mais j'espère que cela pourra aider quelqu'un à faire face à votre défi spécifique. Votre dernier commentaire indiquait que la méthode 'DeliverMessage' effectuait des requêtes HTTP.

Si vous utilisez l'objet 'WebClient' (par exemple) pour faire vos demandes, il sera lié par la propriété ServicePointManager.DefaultConnectionLimit. Cela signifie qu'il créera au plus deux (par défaut) des connexions simultanées à l'hôte. Si vous avez créé 1 000 tâches parallèles, toutes les 1 000 d'entre elles devront être desservies par ces deux connexions.

Vous devrez jouer avec des valeurs différentes pour ce paramètre afin de trouver le juste équilibre entre le débit de votre application et le chargement sur le serveur Web.