VB.NET应用程序冻结而不运行

时间:2012-10-20 22:03:12

标签: vb.net multithreading stream webclient

我有一个应用程序使用循环来调用带有一些参数的新线程,应用程序很棒但是当涉及到100,000条记录时,应用程序没有运行(在CPU和内存taskmgr中没有改变,因此假设该程序无法正常工作)

行动是: 它运行一个函数,首先收集一个数字(X),然后创建一个从0到X的循环,在这个循环中我们创建一个新的Thread和选项,如IsBackground(True),Priority(Normal)和初始化线程。 在同一个函数中,Thread.Join有一个Do While(true),如果你可以跨越它刷新的接口,中止线程,内存清理和DoEvents!

在线程中使用WebClient到OpenRead并将所有这些保存在Stream中。 使用WebClient.IsBusy = False Do我们确保下载信息并继续使用Regex.Match创建MatchCollection。 使用For Each匹配和打印结果,并结束Exit Do。

然后返回到告诉我们的函数......

起初我认为这是因为列表框中打印的结果数量但我得到了它仍然失败,而不是当它达到100,000条记录时(如果不是100,800左右)。

我需要帮助,我不太了解vb.net中的编程并且不明白为什么。

编辑: 我尝试删除For Each of thread,检查是否是。 它已经完全出现了,但是我不明白为什么在线程解决方案中“For Each”时甚至没有给我一个错误?


编辑: 我发现了这个错误,但我不明白我解释:

A) - >初始化函数用0到4500,我调用带参数的线程并接收50个结果,(225000寄存器< - 4500 * 50)当主体For到达~4000时,在Thread中的MatchCollection中失败?我没有收到Regex.Matches的信息然后冻结。

B) - >使用For 4000到4500初始化函数,我调用带参数的线程并接收50个结果,(225000个寄存器< - 4500 * 50),没有更多的开始第一个线程(记住现在从4000到4500开始,我已经收到25000寄存器)程序被冻结,我检查断点并使包含Regex.Matches结果的变量失败,并尝试循环该程序被冻结的数组!

¿为什么呢? ¿解?

谢谢!


功能1(Inicialize Thread)

功能1 - >

For Me.d = 0 To Pages(0) ' <-- 4500
        Dim param(1) As Object
        param(0) = "name"
        param(1) = "url/" & d
        Dim thread As New Thread(AddressOf Thread_)
        thread.IsBackground = True
        thread.Name = "name"
        thread.Priority = ThreadPriority.Normal 'ThreadPriority.Lowest
        thread.Start(param)
        Do While thread.Join(True)
            thread = Nothing
            ClearMemory()
            Application.DoEvents()
            Exit Do
        Loop
    Next d

线程功能:

Public Sub Thread_(ByVal param As Object)
    Try
        If param(0) = "name" Then
            Using Client As New WebClient
                Client.Headers("User-Agent") = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1290.1 Safari/537.13"
                Dim html As Stream = Client.OpenRead(param(1))
                Using reader As New StreamReader(html)
                    Do While wc.IsBusy = False
                        Dim ReadStr = reader.ReadToEnd
                        links = Regex.Matches(ReadStr, "coderegex", RegexOptions.Compiled + RegexOptions.RightToLeft + RegexOptions.Multiline + RegexOptions.Singleline)
                        For Each match In links
                            Registres(0) = Registres(0) + 1
                            Debug.Print("Registro: " & Registres(0) & " pág:" & PagesComplete(0))
                        Next
                        PagesComplete(0) = PagesComplete(0) + 1
                        links = Nothing
                        Client.Dispose()
                        Exit Do
                    Loop
                End Using
            End Using
        End If
    Catch ex As Exception
        Debug.Print("Error " & ex.Message)
    End Try
End Sub

1 个答案:

答案 0 :(得分:0)

这部分看起来很可疑:

Do While thread.Join(True)
    thread = Nothing
    ClearMemory()
    Application.DoEvents()
    Exit Do
Loop

不应该是这样的:

thread.Join()
thread = Nothing
ClearMemory()

如果您使用的是框架&gt; = 4,那么您可以考虑使用Parallel.For(MSDN)。您可以让框架为您处理它,而不是创建自己的线程。