我試圖通過一個Thread對象調用一個方法的出口處,這裏的代碼C#多線程在for循環,如何檢查所有線程
for (int i = 0; i < 255; i++)
{
Thread t = new Thread(new ParameterizedThreadStart(Pinger.Ping));
t.Start(i.ToString());
}
我怎麼能檢查,如果每個線程完成?
我試圖通過一個Thread對象調用一個方法的出口處,這裏的代碼C#多線程在for循環,如何檢查所有線程
for (int i = 0; i < 255; i++)
{
Thread t = new Thread(new ParameterizedThreadStart(Pinger.Ping));
t.Start(i.ToString());
}
我怎麼能檢查,如果每個線程完成?
首先,儘量避免創建這樣的線程,因爲您的應用程序會變成混亂(內存,線程分配)並手動管理線程可能會非常棘手。
建議使用線程池來爲您管理/重用線程。
請仔細閱讀本官方文檔: 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);
那麼方法'Pinger.Ping'的參數呢? –
你需要調用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();
打開'Thread's成'Task's然後'WaitAll' /'WhenAll' –
另一種方法是使用* PLINQ *用'ForAll' –
我寧願想盡量使用'Thread' ,如果沒有,我會用你的解決方案 –