.net 多线程循环有效吗?正确的?
我有下面的多线程函数来实现从URL列表中提取线程以解析内容。代码是由一位用户建议的,我只是想知道这是否是实现我需要做的事情的有效方法。我现在正在运行代码,并且在单线程中所有运行良好的函数上都出现了错误。 例如现在我用来检查访问过的URL的列表;我正在获取“argumentoutofrangeexception-容量小于当前大小”/ 现在是否需要同步所有内容.net 多线程循环有效吗?正确的?,.net,vb.net,multithreading,concurrency,.net,Vb.net,Multithreading,Concurrency,我有下面的多线程函数来实现从URL列表中提取线程以解析内容。代码是由一位用户建议的,我只是想知道这是否是实现我需要做的事情的有效方法。我现在正在运行代码,并且在单线程中所有运行良好的函数上都出现了错误。 例如现在我用来检查访问过的URL的列表;我正在获取“argumentoutofrangeexception-容量小于当前大小”/ 现在是否需要同步所有内容 Dim startwatch As New Stopwatch Dim elapsedTime As Lon
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
如果
processUrl
中的VisitedPages
在线程之间共享,那么是的,您需要确保一次只有一个线程可以访问该集合,除非该集合本身是线程安全的,并为您处理
与您创建的线程之间共享的任何其他数据相同。如果
processUrl
中的访问页面在线程之间共享,则是的,您需要确保一次只有一个线程可以访问该集合,除非该集合本身是线程安全的,并为您处理
创建的线程之间共享的任何其他数据也是如此。我看不到VisitedPages在哪里声明,但我看不到processUrl方法的本地数据。这将使所有线程共享。这将导致多个线程同时访问列表/集合时出现问题。这将产生与您描述的类似的错误。您需要使用互斥锁或其他方法来保护VisitedPages集合以防止出现这种情况。我没有看到VisitedPages在哪里声明,但我没有看到processUrl方法的本地声明。这将使所有线程共享。这将导致多个线程同时访问列表/集合时出现问题。这将产生与您描述的类似的错误。您需要使用互斥锁或其他东西来保护VisitedPages集合,以防止出现这种情况。感谢您的回复;使用synclock是否足以解决此问题?感谢您的回复;使用synclock是否足以解决此问题?感谢您的回复;使用synclock是否足以解决此问题?感谢您的回复;使用synclock是否足以解决此问题?为什么不使用ThreadPool或Parallel.ForEach循环?你至少应该在性能方面看到一些改进;我将对此进行研究。为什么不使用ThreadPool或Parallel.ForEach循环呢?你至少应该在性能方面看到一些改进;我会调查的。