我做了一个类似于我真实计算任务的假测试。我目前的代码是:
static void Main()
{
List<ulong> list = new List<ulong>();
Action action = () =>
{
Random rng = new Random(Guid.NewGuid().GetHashCode());
ulong i = 0;
do
{
i++;
if (rng.Next(100000000) == 1000)
{
lock (list) list.Add(i);
Console.WriteLine("ThreadId {0}, step {1}: match is found",
Thread.CurrentThread.ManagedThreadId, i);
}
} while (list.Count < 100);
};
int length = Environment.ProcessorCount;
Action[] actions = new Action[length];
for (int i = 0; i < length; i++)
actions[i] = action;
Parallel.Invoke(actions);
Console.WriteLine("The process is completed. {0} matches are found. Press any key...",
list.Count);
Console.ReadKey();
}
有没有更好的方法来优化一个长计算过程的并行任务数量?
答案 0 :(得分:2)
我不确定我是否正确理解了这个问题。您共享的代码将并行运行不同的操作实例。但是如果你想为性能并行计算一个长时间运行的任务,那么你应该将长时间运行的任务分成小工作组。或者如果你正在迭代一个集合,你可以使用TPL提供的Parallel for或foreach(任务并行库) )它将根据核心数量和cpu等负载等指标确定线程数。