2017-04-19 82 views
1

我希望只使用2个线程,使for循环的数量限制。我想这样的代码:C#TPL for循环 - 线程

ParallelOptions po = new ParallelOptions { 
    MaxDegreeOfParallelism = 2 
}; 

Parallel.For(0, width, po, x => { 
    sb.Append(Thread.CurrentThread.ManagedThreadId); 
    sb.Append(Environment.NewLine); 
    for (int y = 0; y < height; y++) { 
     double a = (double)(x - (width/2))/(double)(width/4); 
     double b = (double)(y - (height/2))/(double)(height/4); 
    } 
}); 

但是,当我显示Thread.CurrentThread.ManagedThreadId,它会创建2组以上的ID。我也尝试在循环之前添加此代码:

ThreadPool.SetMaxThreads(2, 2); 
ThreadPool.SetMinThreads(2, 2); 

但它也不会改变任何东西。有人可能有任何想法如何解决这个问题?

+0

我希望你不使用StringBuilder的' '在多线程环境中,因为它不是线程安全的 – MickyD

+0

我只用这个来创建所有线程ID的大字符串。你认为,这个StringBuilder会造成运行多于2个线程的问题吗? –

+0

是的。只要使用'Console.WriteLine(Environment.CurrentManagedThreadId)'或'Trace.TraceInformation .....' – MickyD

回答

2

MaxDegreeOfParallelism设置将同时使用Parallel.For()的线程的最大数量。这并不意味着只有两个线程会被使用。

不同的线程可以从线程池的Parallel.For()的执行期间被分配,因为线程池线程被特别设计成可重复使用。

下面的程序演示。如果你运行它,你会看到正在使用不同的线程总数可以超过2,但正在使用的线程总数同时不超过2

using System; 
using System.Collections.Concurrent; 
using System.Threading; 
using System.Threading.Tasks; 

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main() 
     { 
      ParallelOptions po = new ParallelOptions 
      { 
       MaxDegreeOfParallelism = 2 
      }; 

      var activeThreads = new ConcurrentDictionary<int, bool>(); 

      Parallel.For(0, 100, po, x => 
      { 
       activeThreads[Thread.CurrentThread.ManagedThreadId] = true; 
       Console.WriteLine("Active threads: " + string.Join(", ", activeThreads.Keys)); 
       Thread.Sleep(200); 
       activeThreads.TryRemove(Thread.CurrentThread.ManagedThreadId, out bool unused); 
      }); 

      Console.ReadLine(); 
     } 
    } 
}