我有以下多线程函数来实现从url列表中提取线程来解析内容。代码是由用户建议的,我只是想知道这是否是实现我需要做的有效方式。我现在正在运行代码,并且在单个线程上运行良好的所有函数上都会出错。 例如,现在我用来检查访问过的网址的列表;我得到'argumentoutofrangeexception - 容量小于当前大小'/ 现在一切都需要同步吗?
Dim startwatch As New Stopwatch
Dim elapsedTime As Long = 0
Dim urlCompleteList As String = String.Empty
Dim numThread As Integer = 0
Dim ThreadList As New List(Of Thread)
startwatch.Start()
For Each link In completeList
Dim thread = New Thread(AddressOf processUrl)
thread.Start(link)
ThreadList.Add(thread)
Next
For Each Thread In ThreadList
Thread.Join()
Next
startwatch.Stop()
elapsedTime = startwatch.ElapsedMilliseconds
End Sub
enter code here Public Sub processUrl(ByVal url As String)
'make sure we never visited this before
If Not VisitedPages.Contains(url) Then
**VisitedPages.Add(url)**
Dim startwatch As New Stopwatch
Dim elapsedTime As Long = 0
答案 0 :(得分:2)
如果VisitedPages
中的processUrl
在线程之间共享,那么是的,您需要确保一次只有一个线程可以访问该集合 - 除非该集合本身是线程安全的并且要小心对你而言。
与您创建的主题之间共享的任何其他数据相同。
答案 1 :(得分:1)
我没有看到声明VisitedPages的位置,但我没有看到它在processUrl方法的本地。这将使所有线程之间共享。这会导致多个线程同时访问列表/集合时出现问题。这将产生类似于您描述的错误。您需要使用互斥锁或其他东西来保护VisitedPages集合。