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,我不能把我的任务分成小组。这几乎和我上面说的一模一样。这是一个寻找最佳匹配的长遗传算法。我知道在集合上进行并行迭代,但这会降低我的算法的总体性能,并显著增加资源消耗。我已经尝试过这种方法。根据我目前的测试,这个更好。因此,通过在同一时间以不同的起点运行相同的算法,可以提高更快找到匹配的概率。如果是这样的话,我认为你的方法是正确的,第三方物流不会有任何好处。