質問

My code is working but my only problem is that the entire program freezes while it is looping and the freeze only stops when the loop is done, is there any way to get rid of this freezing? i want to see it display from 1 to 21 but instead it freezes and only displays number 21 right away.

Here is my code. Should i change something so that it would tweak its performance? Thanks in advance

  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)
役に立ちましたか?

解決

You need to run this in a backgroundworker.

Thats why your main UI freezes because its waiting for your code to finish. When you have a process that takes time to process, the only way to keep a responsive UI is to use multithreading.

http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx - This one shows the basic on how to use the background worker.

Keep in mind you can only change the value of a textbox for instance from the progresschanged event.

What you can do is that have a button, that starts the backgroundworker, and then you put the code above in the Dowork event.

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

Depeinding on how you want the data in richtextbox to be displayed, this needs also to be handeld in either progresschanged or the completed event.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top