我想在打印结果之前完成for循环,在:
for (int i = 0; i < 5; i++)
{
(new System.Threading.Thread(() =>
{
if (TimeTakingMethod())
{
++nResult;
}
})).Start();
}
Console.WriteLine("Count = " + nResult);
但是Console.WriteLine不会等待那些线程完成,因为打印是在主线程上完成的。
如果我将其更改为:
System.Threading.Thread t = new System.Threading.Thread(() =>
{
for (int i = 0; i < 5; i++)
{
(new System.Threading.Thread(() =>
{
if (TimeTakingMethod())
{
++nResult;
}
})).Start();
}
});
t.Start();
t.Join();
Console.WriteLine("Count = " + nResult);
它仍然无法解决问题,因为不会等待嵌套线程。
任何简单的解决方案?感谢您完成此操作。
答案 0 :(得分:0)
你应该存储创建的线程来控制它们,我使用了List。
int nResult = 0;
List<Thread> threads = new List<Thread>();
for (int i = 0; i < 5; i++)
{
Thread thread = new System.Threading.Thread(() =>
{
if (TimeTakingMethod())
{
++nResult;
}
});
thread.Start();
threads.Add(thread);
}
foreach (Thread thread in threads)
thread.Join();
Console.WriteLine("Count = " + nResult);
答案 1 :(得分:0)
如何执行此操作的示例:
int result = 0;
Task.WaitAll(Enumerable.Range(0, 5)
.Select(index => Task.Factory.StartNew(() =>
{
// Do thread things...
Interlocked.Increment(ref result);
})).ToArray());
Console.WriteLine(result);
需要注意的两个重要事项是Task.WaitAll
,它将导致程序在继续WriteLine调用之前等待所有任务完成。
同样Interlocked.Increment
将允许您安全地增加任何线程的结果。