2008-09-08 10 views
7

J'ai une compréhension basique de cs-major du multithreading mais je n'ai jamais eu à faire autre chose que de simples temporisateurs dans une application. Est-ce que quelqu'un sait d'une bonne ressource qui me donnera une visite comment travailler avec des applications multi-thread, expliquant les bases et peut-être poser certaines des choses les plus difficiles?Je comprends le threading en théorie mais pas en pratique dans .net

Répondre

23

Ceci est une excellente ressource gratuite par Joseph Albahari. Threading in C#

5

Il y a 4 façons de base pour synchroniser les threads en .Net:

  • contrôle BackgroundWorker
  • WaitHandles
  • fonctions de rappel
  • de vote d'un objet AsyncResult

En général, vous voulez pour commencer au sommet de cette liste et travailler vers le bas. Cela signifie d'abord regarder et voir si un contrôle d'arrière-plan est approprié à la situation. Cependant, il suppose à peu près des formes de fenêtres et que vous générez seulement un nouveau fil.

Alors essayez les waithandles. Les waithandles sont bons pour coordonner plusieurs threads ensemble. Vous pouvez tous les renvoyer et les attendre tous pour finir, ou si vous voulez garder un certain nombre de numéros actifs, vous n'en attendez qu'un seul et le suivant quand il se terminera. Ou peut-être savez-vous qu'un thread finira bien plus tôt, alors vous pouvez attendre qu'il se termine, faire un peu de travail, et attendre que le reste se termine. Les waithandles peuvent sembler un peu trop si, disons, vous ne créez qu'un thread supplémentaire et que vous ne voulez pas bloquer jusqu'à ce qu'il soit terminé. Vous pouvez ensuite utiliser un rappel, de sorte que la fonction que vous désignez sera appelée dès que le thread sera terminé. Enfin, si et seulement si, pour une raison ou pour une autre, rien de ce qui précède ne fonctionne, vous pouvez revenir à l'interrogation.

je peux penser à 5 différentes façons d'obtenir un nouveau fil en .Net, également à peu près dans l'ordre:

  • OS créé, normalement à la suite de l'événement WinForms (y compris le BackgoundWorker).
  • Obj.Begin ___()/Fin ____(). Certaines classes CLR ont déjà ces méthodes asynchrones définies pour vous, et évidemment vous voulez les utiliser quand elles sont disponibles.
  • ThreadPool.QueueUserWorkItem(). Utilisez-le la plupart du temps pour créer vos propres discussions.
  • Delegate.BeginInvoke()/EndInvoke(). Vous pouvez envelopper n'importe quelle méthode de cette façon.
  • Thread.Start(). Vous pourrait le faire de cette façon, mais j'ai lu quelque chose récemment (ne pas avoir le lien maintenant) que si QueueUserWorkItem ne fonctionnera pas, la méthode déléguée est probablement meilleure.
1

L'une des meilleures ressources que je connais sur le sujet est le "threading en C#" livre: http://www.albahari.com/threading/

I a un aperçu de tous un développeur .net besoin de comprendre pour programmer des applications multi-thread.