C# 并行一个长计算过程的最佳方法是什么?
我做了一个模拟我的真实计算任务的假测试。我目前的代码是:C# 并行一个长计算过程的最佳方法是什么?,c#,parallel-processing,C#,Parallel Processing,我做了一个模拟我的真实计算任务的假测试。我目前的代码是: static void Main() { List<ulong> list = new List<ulong>(); Action action = () => { Random rng = new Random(Guid.NewGuid().GetHashCode()); ulong i = 0; do {
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();
}
static void Main()
{
列表=新列表();
动作动作=()=>
{
Random rng=new Random(Guid.NewGuid().GetHashCode());
ulongi=0;
做
{
i++;
如果(下一个(100000000)=1000)
{
锁定(列表)列表。添加(i);
WriteLine(“ThreadId{0},步骤{1}:找到匹配项”,
Thread.CurrentThread.ManagedThreadId,i);
}
}而(list.Count<100);
};
int length=Environment.ProcessorCount;
动作[]动作=新动作[长度];
for(int i=0;i
有没有更好的方法来优化一个长计算过程的并行任务数?我不确定我是否正确理解了这个问题。您共享的代码将并行运行该操作的不同实例。但是,如果您希望并行计算长时间运行的任务以提高性能,那么您应该将长时间运行的任务划分为小的工作组,或者如果您正在迭代一个集合,则可以使用parallel for或TPL(task parallel library)提供的foreach这将根据核心数量和CPU负载等指标确定线程数量。您应该查看TPL集合,如
ConcurrentBag
,而不是lock
使用对您不友好的列表kittens@MickyD. 请你自己看看试试。是的。对于那些对OP投反对票的人。如果你知道更好的方法来处理这种情况,请给出你的答案,而不是投反对票。在我问这个问题之前,我在互联网上搜索了很长时间。对于这样的任务,我还没有找到更好的解决方案。那么呢?和你只是在什么方面运气好?我将列表锁定以供编写,因此会遇到什么问题?当另一个线程正在读取它时,它的计数可能会更改?这不是问题,因为当计数大于或等于某个值时,每个循环都将结束。我不明白你的评论。锁定列表的运行速度是ConcurrentBag的三倍。你自己测试一下。对不起@Mertus,我不能把我的任务分成小组。这几乎和我上面说的一模一样。这是一个寻找最佳匹配的长遗传算法。我知道在集合上进行并行迭代,但这会降低我的算法的总体性能,并显著增加资源消耗。我已经尝试过这种方法。根据我目前的测试,这个更好。因此,通过在同一时间以不同的起点运行相同的算法,可以提高更快找到匹配的概率。如果是这样的话,我认为你的方法是正确的,第三方物流不会有任何好处。