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

Cut*_*ert 5 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ens 15

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

    Parallel.For(0, limit, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i =>
    {
        DoWork(i);
    });
Run Code Online (Sandbox Code Playgroud)

至于你的其他问题:

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