.net 多线程循环有效吗?正确的?

.net 多线程循环有效吗?正确的?,.net,vb.net,multithreading,concurrency,.net,Vb.net,Multithreading,Concurrency,我有下面的多线程函数来实现从URL列表中提取线程以解析内容。代码是由一位用户建议的,我只是想知道这是否是实现我需要做的事情的有效方法。我现在正在运行代码,并且在单线程中所有运行良好的函数上都出现了错误。 例如现在我用来检查访问过的URL的列表;我正在获取“argumentoutofrangeexception-容量小于当前大小”/ 现在是否需要同步所有内容 Dim startwatch As New Stopwatch Dim elapsedTime As Lon

我有下面的多线程函数来实现从URL列表中提取线程以解析内容。代码是由一位用户建议的,我只是想知道这是否是实现我需要做的事情的有效方法。我现在正在运行代码,并且在单线程中所有运行良好的函数上都出现了错误。 例如现在我用来检查访问过的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

如果
processUrl
中的
VisitedPages
在线程之间共享,那么是的,您需要确保一次只有一个线程可以访问该集合,除非该集合本身是线程安全的,并为您处理


与您创建的线程之间共享的任何其他数据相同。

如果
processUrl
中的
访问页面在线程之间共享,则是的,您需要确保一次只有一个线程可以访问该集合,除非该集合本身是线程安全的,并为您处理


创建的线程之间共享的任何其他数据也是如此。

我看不到VisitedPages在哪里声明,但我看不到processUrl方法的本地数据。这将使所有线程共享。这将导致多个线程同时访问列表/集合时出现问题。这将产生与您描述的类似的错误。您需要使用互斥锁或其他方法来保护VisitedPages集合以防止出现这种情况。

我没有看到VisitedPages在哪里声明,但我没有看到processUrl方法的本地声明。这将使所有线程共享。这将导致多个线程同时访问列表/集合时出现问题。这将产生与您描述的类似的错误。您需要使用互斥锁或其他东西来保护VisitedPages集合,以防止出现这种情况。

感谢您的回复;使用synclock是否足以解决此问题?感谢您的回复;使用synclock是否足以解决此问题?感谢您的回复;使用synclock是否足以解决此问题?感谢您的回复;使用synclock是否足以解决此问题?为什么不使用ThreadPool或Parallel.ForEach循环?你至少应该在性能方面看到一些改进;我将对此进行研究。为什么不使用ThreadPool或Parallel.ForEach循环呢?你至少应该在性能方面看到一些改进;我会调查的。