如果使用任務,而不是線程它更容易:
var tasks = new List<Task>();
for (int index = 0; index < tests.Count; index/=3)
{
var task = Task.Factory.StartNew(() => SomeFunction(tests.GetRange(start, 3)));
tasks.Add(tasks);
}
Task.WaitAll(tasks.ToArray());
MessageBox.Show("Done!");
如果你真的想使用線程,一個選擇是使用等待句柄:
var waitHandles = new List<EventWaitHandle>();
for (int index = 0; index < tests.Count; index/=3)
{
var waitHandle = new ManualResetEvent(false);
waitHandles.Add(waitHandle);
System.Threading.Thread t =
new System.Threading.Thread(
() =>
{
SomeFunction(tests.GetRange(start, 3));
waitHandle.Set();
});
t.Start();
}
WaitHandle.WaitAll(waitHandles.ToArray());
MessageBox.Show("Done!");
請注意,如果你把這個在UI線程上,UI將被凍結,直到所有線程完成。如果你想避免這種情況,更好的選擇是使用Task.Factory.ContinueWhenAll
,正如Sriram Sakthivel的回答中所建議的那樣。
順便說一句,你確定index/=3
部分?這將導致循環運行,如果test.Count > 0
...
你知道Parallel.For'的'用的描述在這裏http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.for%28v= vs.100%29.aspx – Scoregraphic
你知道你的循環總是會執行一次,最多是正確的嗎? –
@CareyGregory,不,它會永遠執行,除非'tests.Count == 0' –