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

时间:2015-09-02 19:56:55

标签: c# multithreading phantomjs parallel.foreach

我有这样的事情:

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});
});

上面的代码所做的是从urls列表并行打开一些页面并增加currIndex变量。我的问题是: 是否可以通过不同的线程读取currIndex的值,而不是在App中执行上述代码的值?或者是否可以破坏Phantom的哪个实例打开页面?

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

1 个答案:

答案 0 :(得分:0)

  

是否可以通过不同的线程读取currIndex的值,而不是在App中执行上述代码的那个?

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

  

或者是否有可能将Phantom的哪个实例打开页面?

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

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