EachParallel

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 743 fois - Téléchargée 8 fois

Contenu du snippet

             Normal   0         21         false   false   false      FR   X-NONE   X-NONE                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin-top:0cm; 	mso-para-margin-right:0cm; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-fareast-language:EN-US;}    {          public static void EachParallel<T>(this IEnumerable<T> list, Action<T> action)          {              int count = list.Count();              if (count == 0)                  return;              else if (count == 1)              {                  // Si un seul élément est présent, on l'exécute directement sans   // risquer de perde du temps pour la création des threads si aucun   // n'est disponible dans le pool                  action(list.First());              }              else              {                  // La méthode WaitHandle.WaitAll peut gérer au maximum 64 threads                  int maxWaitHandler = count > 64 ? 64 : count;                     // Initialisation des reset events pour connaitre les états                  ManualResetEvent[] resetEvents = new ManualResetEvent[maxWaitHandler];     // On parcours la liste des éléments pour effectuer l'action sur  // chacun                  int i = 0;                  foreach (T item in list)                  {                      int index = i;                      T itemCourant = item;                         if (i >= maxWaitHandler)                          // Si on dépasse la capacité maximum, on attends la libération  // d'une place                          index = WaitHandle.WaitAny(resetEvents);                         resetEvents[index] = new ManualResetEvent(false);                         // Exécution du traitement                      ThreadPool.QueueUserWorkItem(new WaitCallback((object data) =>                      {                          // Execution de la méthode                          action(itemCourant);                             // On informe que le traitement est terminé                          resetEvents[index].Set();                      }));                         i++;                  }                     // On attend que tous les threads aient terminés                  WaitHandle.WaitAll(resetEvents);              }          }      }  

Compatibilité : C# 3.x

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (SoaR245)