2017-09-23 87 views
2

我試圖通過一個Thread對象調用一個方法的出口處,這裏的代碼C#多線程在for循環,如何檢查所有線程

for (int i = 0; i < 255; i++) 
{ 
    Thread t = new Thread(new ParameterizedThreadStart(Pinger.Ping)); 
    t.Start(i.ToString());  
} 

我怎麼能檢查,如果每個線程完成?

+1

打開'Thread's成'Task's然後'WaitAll' /'WhenAll' –

+0

另一種方法是使用* PLINQ *用'ForAll' –

+0

我寧願想盡量使用'Thread' ,如果沒有,我會用你的解決方案 –

回答

1

首先,儘量避免創建這樣的線程,因爲您的應用程序會變成混亂(內存,線程分配)並手動管理線程可能會非常棘手。

建議使用線程池來爲您管理/重用線程。

請仔細閱讀本官方文檔: https://docs.microsoft.com/en-us/dotnet/standard/threading/the-managed-thread-pool

回答你的問題,它應該是這樣的: (我沒有測試的代碼)

var myTasks = new List<Task>(); 
for (int i = 0; i < 255; i++) 
{ 
    myTasks.add(Task.Factory.StartNew(() => Pinger.Ping(parameters...))); 
} 

Tasks.WhenAll(myTasks); 
+0

那麼方法'Pinger.Ping'的參數呢? –

0

你需要調用Join()所有您創建的Theads

List<Thread> threads = new List<Thread>(); 
for (int i = 0; i < 255; i++) 
{ 
    Thread t = new Thread(new ParameterizedThreadStart(Pinger.Ping)); 
    threads.Add(t); 
    t.Start(i.ToString());  
} 

for (int i = 0; i < 255; i++) 
    threads[i].Join();