从运行parallel.foreach的不同线程访问变量

本文关键字:线程 访问 变量 运行 parallel foreach | 更新日期: 2023-09-27 18:10:51

我有这样的东西:

int index = 0;
Parallel.ForEach(urls, ParOpt, (url) =>
{
  var currIndex = Interlocked.Increment(ref index);                 
  var pjs = new PhantomJS();  //wrapper for PhantomJS
  pjs.Run(@"c:'script.js", new string[] { url});
});

以上代码所做的是并行打开url列表中的一些页面并增加currIndex变量。我的问题是:是否有可能通过不同的线程读取currIndex的值,而不是在应用程序中执行上述代码?或者是否可以确定是哪个Phantom实例打开了该页面?

另外,我不想使用查询字符串

从运行parallel.foreach的不同线程访问变量

是否有可能通过不同的线程读取currenindex的值,而不是在App中执行上述代码的线程?

currIndex变量是并行操作匿名方法中的一个局部变量。它只对方法本身可见,不能从任何其他线程直接访问。

或者是否可以确定是哪个Phantom实例打开了该页面?

如果您需要其他线程能够将特定URL与PhantomJS对象的特定实例相关联,您可以(如上面的评论所建议的)使用ConcurrentDictionary<string, PhantomJS>的实例来提供一种方便的方法来检索给定URL的PhantomJS对象。

请注意,indexcurrIndex变量虽然会为匿名方法的每个并发调用提供唯一的ID,但不一定会提供相对于原始urls集合中元素顺序的索引。线程调度的差异可能导致对集合中较晚的元素的调用在调用集合中较早的元素之前实际执行。