5

在此示例中,Parallel.For如果我想将一次可以执行该功能的线程数限制DoWork为 10 个,那么循环的正确使用是否正确?是否会阻塞其他线程,直到十个线程之一可用?如果不是,有什么更好的多线程解决方案仍然可以让我执行该功能 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());
    }
}
4

1 回答 1

16

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

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

至于你的其他问题:

  • 是的,这将正确限制同时工作的线程数量。
  • 没有线程被阻塞。迭代被排队,一旦线程变得可用,它就会从队列中获取下一个迭代(以同步方式)来处理。
于 2013-01-08T18:59:37.523 回答