C#内部for循环

时间:2016-03-20 13:45:59

标签: c# multithreading for-loop nested

我想在打印结果之前完成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);

它仍然无法解决问题,因为不会等待嵌套线程。

任何简单的解决方案?感谢您完成此操作。

2 个答案:

答案 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将允许您安全地增加任何线程的结果。