2010-03-18 109 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