我有这样的事情:
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的哪个实例打开页面?
另外,我不想使用查询字符串。
答案 0 :(得分:0)
是否可以通过不同的线程读取currIndex的值,而不是在App中执行上述代码的那个?
没有。 currIndex
变量是并行操作的匿名方法中的局部变量。它只对方法本身可见,不能直接从任何其他线程访问。
或者是否有可能将Phantom的哪个实例打开页面?
如果您需要某个其他线程能够将特定URL与PhantomJS
对象的特定实例相关联,您可以(如上面的注释中所建议的)使用ConcurrentDictionary<string, PhantomJS>
的实例提供一种方便的方法来检索给定URL的PhantomJS
对象。
请注意index
和currIndex
变量,虽然它们将为匿名方法的每个并发调用提供唯一ID,但不必然会提供相对索引到原始urls
集合中元素的顺序。线程调度的差异可能导致在调用集合中的早期元素之前调用实际执行的集合中的后续元素。