2010-03-18 105 views
0

我写了一个多线程的爬行程序,该过程只是简单地创建线程并让它们访问要爬行的URL列表。然后他们访问网址并解析html内容。所有这些似乎工作正常。现在,当我需要写入数据库中的表格时,我遇到了问题。我有2个声明的数组列表将包含每个线程解析的内容。第一个arraylist只是rss供稿链接,另一个arraylist包含不同的帖子。 然后,我使用每个循环迭代一个,同时顺序递增另一个并写入数据库。 我的问题是,每次有新线程访问其中一个列表时,内容都会发生变化,这会影响迭代。我试过使用嵌套循环,但它没有工作之前,这工作正常使用单线程。我希望这是有道理的。这里是我的代码:多线程问题

  SyncLock dlock 
       For Each l As String In links 
        finallinks.Add(l) 
       Next 
      End SyncLock 

       SyncLock dlock 
       For Each p As String In posts 
        finalposts.Add(p) 
       Next 
       End SyncLock 
      ... 
       Dim i As Integer = 0 
      SyncLock dlock 
     For Each rsslink As String In finallinks 
      postlink = finalposts.Item(i) 
      i = i + 1 

finallinks和finalposts是两个arraylist。我不包括代码的其余部分,显示线程工作,但是这是在发生我的错误基本上是在这里

postlink = finalposts.Item(i) 
i = i + 1 
ERROR: index was out of range. Must be non-negative and less than the size of the collection 

是否有其他的重要组成部分?

回答

1

貌似收集finallinksfinalposts大,这是它

+0

好吧我现在觉得很蠢,谢谢你的回应。这很好地使用单线程,但我怎么能锁定finallinks和finalposts将它们写入到一个表中,而复制到finallinks和finalposts的列表由线程使用,并且出于性能原因不锁定。这有意义吗?你有另一种方式我应该这样做吗? – vbNewbie 2010-03-18 15:26:44

+0

有没有人可以提供帮助? – vbNewbie 2010-03-18 15:49:08

+0

您的请求变得复杂。阅读一些关于多线程的文章,然后你会自己解决。 – Andrey 2010-03-18 15:51:37

1

看到,如果一个ProducerConsumer类会为你工作。你的解析线程将是生产者,你的数据库线程将成为消费者。

如果您阅读链接页面并尝试使用代码,则应该能够根据需要进行调整。

1

我相信有一个名为BlockingContainer的.NET容器或类似的适用于Producer-Consumer-patterns的东西,我假设你在vb.net中工作。

1

关于他问你问安德烈:

你不能(或更好的,你不应该)访问finallinks和finalposts阅读,并在同一时间写的,所以你需要锁定,因为实例的ArrayList方法对多线程不安全。

所以为了简单起见,您不能在添加项目的同时读取它们以写入数据表。你可以做的是锁定列表,创建它们的克隆以将克隆写入数据表,清除原始列表并解锁它们。这样你有一个列表写入数据库,另一个由线程填写。

我希望这会有所帮助。

+0

这里是我看到大家别人的帖子以前那样: 的SyncLock dlock 对于每个L作为字符串中的链接 finallinks.Add(L) 接下来 最终的SyncLock “锁临时职位要添加到列表 的SyncLock dlock 对于每个p作为字符串在帖子 finalposts。添加(P) 接着 结束的SyncLock 尝试 SYNCLOCK dlock 暗淡OUTFILE作为新的StreamWriter(Environment.CurrentDirectory,真) 昏暗我为整数= 0 用于每一个链路作为字符串在finallinks 虽然I vbNewbie 2010-03-20 18:03:54

+0

很痛苦在这里读你的代码:)你可以把它在你的问题编辑? – 2010-03-21 08:20:31