0

我的代码正在运行,但我唯一的问题是整个程序在循环时冻结,并且仅在循环完成时冻结才停止,有没有办法摆脱这种冻结?我想看到它从 1 到 21 显示,但它冻结了,只立即显示数字 21。

这是我的代码。我应该改变一些东西以调整它的性能吗?提前致谢

  Dim x As Integer = 0
    Do
        Dim POST As String = "authenticity_token=weZnH8V68yQSnQh91UtDZyatys%2FXtPQGN2vooyW4opY%3D&email%5Bto_address%5D=intes2010%40gmail.com&email%5Bfrom_name%5D=Test&email%5Bfrom_address%5D=test%40email.com&email%5Bnote%5D=today+is+a+big+success&email%5Bcopy_yourself%5D=0&id=house-of-pies-466226000"
        Dim request As HttpWebRequest
        Dim response As HttpWebResponse
        Dim tempCookies As New CookieContainer
        request = CType(WebRequest.Create("http://www.yellowpages.com/los-angeles-ca/mip/house-of-pies-466226000/send_email?lid=1000083727260"), HttpWebRequest)
        request.ContentType = "application/x-www-form-urlencoded"
        request.ContentLength = POST.Length
        request.Method = "POST"
        request.KeepAlive = True
        request.CookieContainer = tempCookies

        Dim requestStream As Stream = request.GetRequestStream()
        Dim postBytes As Byte() = Encoding.ASCII.GetBytes(POST)
        requestStream.Write(postBytes, 0, postBytes.Length)
        requestStream.Close()

        response = CType(request.GetResponse(), HttpWebResponse)
        tempCookies.Add(response.Cookies)
        Dim postreader As New StreamReader(response.GetResponseStream())

        Dim thepage As String = postreader.ReadToEnd
        RichTextBox1.Text = thepage
        response.Close()

        x = x + 1
        Label1.Text = x
    Loop While (x <= 20)
4

1 回答 1

1

您需要在后台工作程序中运行它。

这就是您的主 UI 冻结的原因,因为它正在等待您的代码完成。当您有一个需要时间来处理的进程时,保持响应式 UI 的唯一方法是使用多线程。

http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx - 这个展示了如何使用后台工作者的基本知识。

请记住,您只能更改文本框的值,例如从 progresschanged 事件。

你可以做的是有一个按钮,它启动后台工作程序,然后你把上面的代码放在 Dowork 事件中。

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Try
        If BackgroundWorker1.IsBusy <> True Then
            BackgroundWorker1.RunWorkerAsync()
        End If
    Catch ex As Exception

    End Try
End Sub

Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Dim worker As System.ComponentModel.BackgroundWorker = CType(sender, System.ComponentModel.BackgroundWorker)
    Try
        Dim x As Integer = 0
        Do
            Dim POST As String = "authenticity_token=weZnH8V68yQSnQh91UtDZyatys%2FXtPQGN2vooyW4opY%3D&email%5Bto_address%5D=intes2010%40gmail.com&email%5Bfrom_name%5D=Test&email%5Bfrom_address%5D=test%40email.com&email%5Bnote%5D=today+is+a+big+success&email%5Bcopy_yourself%5D=0&id=house-of-pies-466226000"
            Dim request As HttpWebRequest
            Dim response As HttpWebResponse
            Dim tempCookies As New CookieContainer
            request = CType(WebRequest.Create("http://www.yellowpages.com/los-angeles-ca/mip/house-of-pies-466226000/send_email?lid=1000083727260"), HttpWebRequest)
            request.ContentType = "application/x-www-form-urlencoded"
            request.ContentLength = POST.Length
            request.Method = "POST"
            request.KeepAlive = True
            request.CookieContainer = tempCookies

            Dim requestStream As Stream = request.GetRequestStream()
            Dim postBytes As Byte() = Encoding.ASCII.GetBytes(POST)
            requestStream.Write(postBytes, 0, postBytes.Length)
            requestStream.Close()

            response = CType(request.GetResponse(), HttpWebResponse)
            tempCookies.Add(response.Cookies)
            Dim postreader As New StreamReader(response.GetResponseStream())

            Dim thepage As String = postreader.ReadToEnd
            e.Result = CType(thepage, String)
            response.Close()

            x = x + 1
            worker.ReportProgress(x)
        Loop While (x <= 20)
    Catch ex As Exception

    End Try
End Sub
Private Sub BackgroundWorker1_ProgressChanged(sender As System.Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    Try
        Label1.Text = e.ProgressPercentage.ToString()
    Catch ex As Exception

    End Try
End Sub
Private Sub BackgroundWorker1_Completed(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    Try
        RichTextBox1.Text = e.Result.ToString()
    Catch ex As Exception

    End Try
End Sub

取决于您希望如何显示richtextbox 中的数据,这也需要在progresschanged 或completed 事件中处理。

于 2013-07-10T11:38:33.360 回答