27 votes

Améliorations du multithreading dans .NET 4

J'ai entendu dire que l' .NET 4 est ajouté à l'équipe de nouvelles classes dans le cadre qui rendent le travail avec les threads meilleure et plus facile.

Fondamentalement, la question est de savoir quelles sont les nouvelles façons d'exécuter multithread tâches ajouté .NET 4 et quels sont-ils conçus pour être utilisés?

UPD: Juste pour que ce soit clair, je ne cherche pas une seule façon d'exécuter des tâches parallèles dans .NET 4, je veux savoir qui sont les nouveaux ajoutés, et si possible quelle situation de chacun d'entre eux convient le mieux..

35voto

Artiom Chilaru Points 5049

Avec l'absence de réponses, j'ai décidé d'évaluer les réponses ci-dessous avec ce que j'ai appris.. Comme @Scott a déclaré:.NET 4 a ajouté la Task Parallel Library qui ajoute un certain nombre d'innovations, de nouvelles méthodes et approches pour le parallélisme.

  • L'une des premières choses à mentionner est l' Parallel.For et Parallel.ForEach méthodes, qui permettent au développeur de traiter plusieurs éléments en plusieurs threads. Le Cadre, dans ce cas, décidez combien de fils sont nécessaires, et quand créer de nouveaux threads, et quand ne pas.
    C'est très simple et directe de paralléliser le code existant, et ajouter un peu de boost de performance.
  • Une autre façon, un peu similaire à la précédente approches est l'aide de l'PLINQ rallonges. Ils prennent un existant de l'énumération, et l'étendre avec parallel linq rallonges. Donc, si vous avez une requête linq, vous pouvez facilement convertir PLINQ. Ce que cela signifie, c'est toutes les opérations sur la PLINQ énumérable pourront également profiter de plusieurs threads, et le filtrage de la liste de vos objets à l'aide d'un .Where clause, par exemple, se déroulera dans plusieurs threads maintenant!
  • L'une des plus grandes innovations dans le TPL est le nouveau Task classe. À certains égards, il peut ressembler à du déjà bien connu, Thread classe, mais il faut profiter de la nouvelle Pool de Threads .NET 4 (qui a été beaucoup amélioré par rapport à de précédentes versions), et est beaucoup plus fonctionnel que le régulier Thread classe. Par exemple, vous pouvez enchaîner les Tâches où des tâches dans le milieu de la chaîne ne démarre que lorsque les précédents terminer. Des exemples et des explications approfondies dans un screencast sur Canal 9
  • Pour améliorer le travail à la Tâche classes, on peut utiliser l' BlockingCollection<>. Cela fonctionne parfaitement dans le cas où vous disposez d'un producteur-consommateur scénario. Vous pouvez avoir plusieurs threads de la production de certains objets, qui seront ensuite consommés et transformés par le consommateur méthodes. Cela peut facilement être parallélisé et contrôlé avec la Tâche de l'usine et le blocage de la collection. Utile screencast avec des exemples de Canal 9
    Ceux-ci peuvent également utiliser différents sauvegarde des classes de stockage (ConcurrentQueue, ConcurentStack, ConcurrentBag), qui sont tous les thread-safe, et sont différentes en fonction de l'élément de commande et de performance. Des exemples et des explications dans une autre vidéo ici
  • Encore une nouvelle chose qui a été ajouté (qui n'est probablement pas partie de la TPL, mais nous permet ici de toute façon) est l' CountdownEvent classe, qui peut nous aider à "la coordination des tâches des scénarios" (c). Fondamentalement, nous permet d'attendre jusqu'à ce que toutes les tâches parallèles sont finis. Screencast avec exemple d'utilisation sur le Canal 9

Vous pouvez voir un certain nombre de screencasts et des vidéos sur le Canal 9 qui sont marqués avec le "Calcul Parallèle"

15voto

Scott Dorman Points 25000

Oui, .NET 4 a ajouté la Task Parallel Library qui, à un haut niveau, ajoute le support pour:

  • l'exécution en parallèle des boucles Parallel.For et Parallel.ForEach
  • créer ou exécuter des tâches à l'aide d' Parallel.Invoke ou Task classe
  • PLINQ (parallel LINQ to Objects)

Répondre à la mise à jour à la question de départ...

Le TPL est le préféré de l'écriture en parallèle des tâches à l'aide .NET 4. Vous pouvez toujours créer threadpool vous-même, et de faire tous de la même "manuel" thread de techniques que vous pouvez avant. La chose à garder à l'esprit est que l'ensemble du pool de threads (et à peu près tout ce que le filetage liées) a été réécrit pour tirer parti de la TPL. Cela signifie que même si vous créez un pool de threads de l'élément de vous-même vous même à l'aide de la TPL, même si vous ne le connaissez pas. L'autre chose à garder à l'esprit est que les TPL est beaucoup plus optimisé, et à l'échelle de façon plus appropriée, sur la base du nombre de processeurs disponibles.

Quant à savoir ce que la situation de chacun d'entre eux serait le mieux adapté, il n'y a pas de "silver bullet" réponse. Si vous avez déjà été mise en queue de votre propre pool de threads (ou sinon de faire quelque chose de multi-thread), vous pouvez modifier la partie de votre code pour utiliser le TPL sans conséquences.

Pour des choses comme les boucles parallèles ou des requêtes en parallèle, vous devrez analyser le code et l'exécution de ce code pour déterminer s'il convient d'être parallélisé.

1voto

Chris S Points 32376

Strictement parlant, il s'agit de C# 4.0 et pas une nouvelle classe, mais les événements ont maintenant une forme plus intelligente de verrouillage qui, si j'ai bien compris la modification correctement, supprime la nécessité pour reems de code de verrouillage comme indiqué ci-dessous (tiré de cet article par Jon Skeet):

SomeEventHandler someEvent;
readonly object someEventLock = new object();

public event SomeEventHandler SomeEvent
{
    add
    {
        lock (someEventLock)
        {
            someEvent += value;
        }
    }
    remove
    {
        lock (someEventLock)
        {
            someEvent -= value;
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X