2013-10-11 20 views
0

什麼是等價的方式,使用線程池,實現代碼如下:轉換啓動專用線程的線程池

接收機是我實例

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

對運行時的版本,你可以使用任務並行庫? –

+0

我正在使用Visual Studio 2012 4.5安裝 – BossRoss

回答

0

要回答我原來的問題:

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

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


} 
+0

如果您正在啓動的任務長時間運行,則會導致鎖定線程池。如果您擁有足夠多的帳戶,則有些任務甚至可能無法運行。線程池被設計用於相對短暫的任務。 –

+0

在這種情況下,線程的數量將是已知的常量。最多8個線程。感謝您的信息。 – BossRoss

3

那麼你不一定會一類如果切換到ThreadPool,可以命名線程,但是您可以使用Task Parallel庫來實現您的目標。 TPL

一種方法是

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

甚至使用Parallel.ForEach

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

這些都可以讓我也配置一個特定的線程嗎? – BossRoss

+1

@BossRoss - 你爲什麼要放置一個線程池線程? – Lee

+0

@BossRoss你是什麼意思?應該不應該殺死或處理ThreadPool中的線程,該線程將需要重用。 –

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(); 
     } 
    } 
}