多线程循环高效?对?

时间:2010-02-02 16:00:30

标签: .net vb.net multithreading concurrency

我有以下多线程函数来实现从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

2 个答案:

答案 0 :(得分:2)

如果VisitedPages中的processUrl在线程之间共享,那么是的,您需要确保一次只有一个线程可以访问该集合 - 除非该集合本身是线程安全的并且要小心对你而言。

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

答案 1 :(得分:1)

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