2013-10-11 1 views
0

Quelle serait la façon équivalente, en utilisant ThreadPool, pour obtenir le code ci-dessous:convertir à partir des fils dédiés à Threadpool

récepteur est une classe que je suis l'instanciation

foreach (MobileAccounts MobileAccount in ReceiverAccounts) 
{       
    Receiver rec = new Receiver(); 
    ThreadStart starterParameters = delegate { rec.StartListener(MobileAccount); }; 
    Thread FeedbackThread = new Thread(starterParameters); 
    FeedbackThread.Name = MobileAccount.FriendlyName; 

    FeedbackThread.Start();                       
} 
+0

Quelle runtime la version, pouvez-vous utiliser la bibliothèque parallèle des tâches ? –

+0

J'utilise Visual Studio 2012 avec 4.5 installé – BossRoss

Répondre

0

Pour répondre à ma question initiale:

foreach (MobileAccounts MobileAccount in ReceiverAccounts) 
{ 
    Receiver rec = new Receiver(); 

    ThreadPool.QueueUserWorkItem(delegate { rec.StartListener(MobileAccount); }, null);      


} 
+0

Si les tâches que vous lancez sont de longue durée, cela risque de bloquer le pool de threads. Certaines de vos tâches peuvent même ne pas fonctionner si vous avez un nombre de comptes suffisant. Le pool de threads est conçu pour une utilisation avec des tâches relativement de courte durée. –

+0

Le nombre de threads sera une constante connue dans ce cas. 8 Threads au maximum. Merci pour l'information. – BossRoss

3

Eh bien vous ne serez pas nécessairement être capable de nommer les threads si vous passez à un ThreadPool, cependant vous pouvez simplement utiliser la bibliothèque Task Parallel pour atteindre vos objectifs. TPL

Une façon serait

foreach (MobileAccounts MobileAccount in ReceiverAccounts) { 
    Receiver rec = new Receiver(); 
    Task.Run(() => rec.StartListener(MobileAccount)); 
} 

ou même en utilisant Parallel.ForEach

Parallel.ForEach(ReceiverAccounts, 
       MobileAccount => new Receiver().StartListener(MobileAccount)); 
+0

Est-ce que l'un de ceux-ci me permettra également de disposer d'un fil spécifique? – BossRoss

+1

@BossRoss - Pourquoi devriez-vous disposer d'un thread de pool de threads? – Lee

+0

@BossRoss que voulez-vous dire? devrait ne pas tuer ou disposer des threads dans le ThreadPool, le thread aurait besoin d'être réutilisé. –

0
var tokenSource2 = new CancellationTokenSource(); 

    foreach (MobileAccounts MobileAccount in ReceiverAccounts) 
    { 
    var rec = new Receiver(); 
    var ct = tokenSource2.Token; 
    Task.Factory.StartNew(() => this.DoWorkEventArgs(rec, ct)); 
    } 

// Anywhere outside you can call tokenSource2.Cancel(); 


private void DoWorkEventArgs(Receiver rec, CancellationToken ct) 
{ 
    // Were we already canceled? 
    ct.ThrowIfCancellationRequested(); 

    bool moreToDo = true; 
    while (moreToDo) 
    { 
     // Poll on this property if you have to do 
     // other cleanup before throwing. 
     if (ct.IsCancellationRequested) 
     { 
     // Clean up here, then... 
     ct.ThrowIfCancellationRequested(); 
     } 
    } 
} 
Questions connexes