Parallel.For/Foreach 循环以同步顺序获取列表外的元素
Parallel.For/Foreach loop take elements outside of a list in synchronized order
我有一个并行的 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);
这样无限期地重复迭代。
有人可以帮我解决这个问题吗?
这将对所有元素执行相同的次数。
只要你只从列表中读取它就应该是线程安全的。
但是'sequential in time'与并行不兼容。
Parallel.For(0, 5000, ex=>
{
int myIndex = ex % itemsList.Count;
string myItem = itemsList[myIndex];
// use myItem
});
我有一个并行的 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);
这样无限期地重复迭代。
有人可以帮我解决这个问题吗?
这将对所有元素执行相同的次数。
只要你只从列表中读取它就应该是线程安全的。
但是'sequential in time'与并行不兼容。
Parallel.For(0, 5000, ex=>
{
int myIndex = ex % itemsList.Count;
string myItem = itemsList[myIndex];
// use myItem
});