代码之家  ›  专栏  ›  技术社区  ›  User987

parallel.for/foreach循环按同步顺序将元素从列表中取出

  •  0
  • User987  · 技术社区  · 6 年前

    我有一个并行for循环和一个如下所示的列表:

     var itemsList = new List<string> { "1","2","3","4","5","6","7","8","9","10","11" };
    
     Parallel.For(0, 5000, ex=>
     {
    
     });
    

    我想在这里做的是:

    • 从itemslist中按元素在列表中的确切顺序逐个取出元素,而不管是否随机调用并行迭代

    因此,基本上,在第一个随机并行操作中,“1”值下的项目将存储在第一个变量中,如下所示:

    var itemFromList = itemList.elementAt(0).Take(1);
    

    在并行foreach/for循环的第二次迭代中:

    var itemFromList = itemList.elementAt(1).Take(1);
    

    一旦列表中的所有11项都被使用..我想再次重复这个过程。

    如果存储在变量中的最后一个项:

    var itemFromList = itemList.elementAt(10).Take(1); // Last item
    

    然后再次使用列表中的第一项:

    var itemfromlist=itemlist.elementat(0).take(1);
    

    像这样的迭代无限期地重复。

    有人能帮我解决这个问题吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Henk Holterman    6 年前

    这将在所有元素上执行相同的次数。
    只要你只从列表中读,它就应该是线程安全的。

    但是“时间顺序”与并行不兼容。

     Parallel.For(0, 5000, ex=>
     {
        int myIndex = ex % itemsList.Count;
        string myItem = itemsList[myIndex];
        // use myItem
     });