在C#中正确使用Parallel for循环?

时间:2013-01-08 18:53:35

标签: c# multithreading

在这个例子中,如果我想将一次可以执行函数Parallel.For的线程数限制为十个,那么这是正确使用DoWork循环吗?在十个线程中的一个可用之前,是否会阻塞其他线程?如果没有,什么是更好的多线程解决方案,仍然可以让我执行6000次以上的功能?

class Program
{
    static void Main(string[] args)
    {
        ThreadExample ex = new ThreadExample(); 
    }
}

public class ThreadExample
{
    int limit = 6411; 

    public ThreadExample()
    {
        Console.WriteLine("Starting threads...");
        int temp = 0; 
        Parallel.For(temp, limit, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i =>
        {
            DoWork(temp);
            temp++; 
        }); 
    }

    public void DoWork(int info)
    {
        //Thread.Sleep(50); //doing some work here. 

        int num = info * 5; 

        Console.WriteLine("Thread: {0}      Result: {1}", info.ToString(), num.ToString());
    }
}

1 个答案:

答案 0 :(得分:15)

您需要使用传递给lambda函数的i作为索引。 Parallel.For使您免于使用循环计数器的麻烦,但您需要使用它!

    Parallel.For(0, limit, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i =>
    {
        DoWork(i);
    });

至于你的其他问题:

  • 是的,这将正确限制同时工作的线程数。
  • 没有线程被阻止。迭代排队,一旦线程可用,它将从队列进行下一次迭代(以同步方式)进行处理。