C#TPL for循环 - 线程
问题描述:
我希望只使用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);
但它也不会改变任何东西。有人可能有任何想法如何解决这个问题?
答
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();
}
}
}
我希望你不使用StringBuilder的' '在多线程环境中,因为它不是线程安全的 – MickyD
我只用这个来创建所有线程ID的大字符串。你认为,这个StringBuilder会造成运行多于2个线程的问题吗? –
是的。只要使用'Console.WriteLine(Environment.CurrentManagedThreadId)'或'Trace.TraceInformation .....' – MickyD