【问题标题】:Combining Parallel loop with thread logic将并行循环与线程逻辑相结合
【发布时间】:2017-06-07 17:55:31
【问题描述】:

我写了一段代码,如下所示:

var allParams = new List<string>(); // supposingly has 10 items inside it
var secondCollection = new List<string>(); // collection of 100
Parallel.For(0, secondCollection.Count(), new ParallelOptions { 
MaxDegreeOfParallelism = 10 }, counter => 
{
    callingSomeMethod(params[counter]);
});

我正在尝试找出最佳方法,如何将我的 params 集合与并行 for 循环结合起来,以制作如下所示的内容:

  • 当 10 个线程同时启动时,我想在 callSomeMethod 方法中传递所有 10 个元素,当其中一个线程结束时,我想只是简单地重新开始在位置 0 传递元素, 1, 2, 3,4,5,6,7,8,9,0,1,2,3...

因此循环会不断重复,直到 Parallel.For 循环结束它的循环...

并行循环是否可行?我不确定我将如何实现这一点,有人可以帮助我吗?

【问题讨论】:

  • 你试过了吗?您遇到了哪些错误/问题?
  • @Kyle 不,我实际上什至不知道如何开始它,它仍然在我的脑海中“模糊”,这就是为什么我开始讨论它是否可行
  • 试试吧。它可能会起作用。顺便说一句,我想你的意思是counter % allParams.Length。按原样传递counter 将导致您得到ArgumentOutOfRange 异常。
  • MaxDegreeOfParallelism 不保证会使用 10 个线程。只有 10 个是最大值。
  • @PeterBons 一次使用多少个线程并不重要,只是当 1 个线程被释放时,使用 allParams 中的下一个可用字符串

标签: c# asp.net asp.net-mvc multithreading parallel-processing


【解决方案1】:

所以你有一个“锯齿状数组”,两个不同长度的列表需要压缩在一起进行处理,两个列表中较短的一个会根据需要重复。关于它?

这样的事情怎么样?

var allParams = new List<string>(); // supposingly has 10 items inside it
var secondCollection = new List<string>(); // collection of 100
var queue = new ConcurrentQueue<string>(secondCollection); //Copy of 100

while (queue.Count > 0)
{
    Parallel.ForEach(allParams, new ParallelOptions { MaxDegreeOfParallelism = 10 }, 
    (param) =>
    {
        string item;
        bool ok = queue.TryDequeue(out item);
        if (ok)
        {
            callingSomeMethod(param, item);
        }
    });
}

想法是将较长列表中的项目放入ConcurrentQueue,然后反复迭代较短的列表,直到队列为空。每次迭代都从 foreach 循环中的迭代器和队列中获取一个项目,并且可以同时处理这两个项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-02
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    相关资源
    最近更新 更多