VB.Net背景我的代码中的工人?

时间:2011-10-03 20:20:20

标签: vb.net httpwebrequest backgroundworker

我对vb.net有点不高兴,我做了很多http请求和流阅读的应用程序。但是当它这样做时,它总是冻结我的应用程序。

所以我做了一些研究,发现我可以使用后台工作者来解决这个问题。但我不知道从哪里开始。所以,如果你能看一下我的代码并告诉我在哪里以及如何添加后台工作人员以防止冻结那些令人敬畏的代码。

Imports mshtml
Imports System.Net
Imports System.Threading
Imports System.Text
Imports System.IO
Imports System.Web

Public Class Form1
    Inherits Form

    Private Delegate Sub MyDelegate(show As Boolean)
    Private demoThread As System.Threading.Thread = Nothing
    Private demoThread2 As System.Threading.Thread = Nothing

    Private Sub ShowProgressOnThread()
        Dim newProgressWindow As New Form2
        newProgressWindow.Show()
    End Sub

    Public Function GetTableText(ByVal sHTML As String) As String
       Dim myDoc As mshtml.IHTMLDocument2 = New mshtml.HTMLDocument
        Dim mElement As mshtml.IHTMLElement
        Dim mElement2 As mshtml.IHTMLElement
        Dim mECol As mshtml.IHTMLElementCollection

        'initialize the document object within the HTMLDocument class...
        myDoc.close()
        myDoc.open("about:blank")
        'write the HTML to the document using the MSHTML "write" method...

        Dim clsHTML() As Object = {sHTML}
        myDoc.write(clsHTML)
        clsHTML = Nothing
        mElement = myDoc.body()
        mECol = mElement.getElementsByTagName("TD")

        Dim gData As ListViewItem

        For A = 3 To mECol.length - 1 Step +6

            mElement2 = mECol.item(A)

            gData = Me.ListView1.Items.Add(mElement2.innerText)

            mElement2 = mECol.item(A - 1)

            gData.SubItems.Add(mElement2.innerText.ToUpper)

            'Frm.Close()



            ' lstResults.Items.Add("Game : " & mElement2.innerText)
        Next
    End Function

    Private Sub wait(ByVal interval As Integer)
        Dim sw As New Stopwatch
        sw.Start()
        Do While sw.ElapsedMilliseconds < interval
            ' Allows UI to remain responsive
            Application.DoEvents()
        Loop
        sw.Stop()
    End Sub

    Private Sub Button__()
        Me.ResetText()
        Me.ToolStripStatusLabel1.Text = "Loading..."
        Me.Text = "Game Finder | By Unh0ly | Loading..."
        ' Me.demoThread = New Thread( _
        'New ThreadStart(AddressOf Me.Loader))

        ' Me.demoThread.Start()

        'Me.Invoke(New MethodInvoker(AddressOf Me.Loader))



        'Me.Frm.Show()
        'Application.Run(Frm)


        Dim srchText As String
        srchText = TextBox1.Text.Replace(" ", "%20")

        Dim request As HttpWebRequest = HttpWebRequest.Create("****" & srchText)
        'Dim response As HttpWebResponse

        Dim response As HttpWebResponse = request.GetResponse()

        Dim sr As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream())

        Dim sourcecode As String = sr.ReadToEnd()


        If sourcecode.Contains("<td>") Then
            GetTableText(sourcecode)

            Me.ResetText()
            Me.Text = "Game Finder | By Unh0ly"
            Me.ToolStripStatusLabel1.Text = "Done"
            Call wait(2500)
            Me.ToolStripStatusLabel1.Text = "Status.."
            'newProgressWindow.Hide()
            'newProgressWindow.Dispose()
            'Form2.Refresh()
        ElseIf Not sourcecode.Contains("<td>") Then
            ' newProgressWindow.Hide()
            ' Progress.Dispose()
            MessageBox.Show("No Results Found For: " + TextBox1.Text)
        End If
        'Dim sHTML = sourcecode
        'For I = 2 To mECol.length - 1 Step +6


    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        'Frm.Show()

        Me.Invoke(New MethodInvoker(AddressOf Button__))

        'Dim demoThread As System.Threading.Thread
    End Sub

    Private Sub CopyToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles CopyToolStripMenuItem.Click, IDAndGameNameToolStripMenuItem.Click
        Try

            Dim s As String


            Dim lsvrow
            lsvrow = ListView1.SelectedItems(0)

            s = "Game Name: " + lsvrow.Text + ControlChars.NewLine + "ID: " + TextBox2.Text



            Clipboard.SetDataObject(s)
        Catch ex As System.Exception
            MessageBox.Show("Error: " + ex.Message)
        Finally
            ' Perform any tidy up code.
        End Try
    End Sub
    Private Sub CopyIDToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles CopyIDToolStripMenuItem.Click, IDToolStripMenuItem.Click
        Try
            Dim s As String


            Dim lsvrow
            lsvrow = ListView1.SelectedItems(0)

            s = TextBox2.Text



            Clipboard.SetDataObject(s)

        Catch ex As System.Exception
            MessageBox.Show("Error: " + ex.Message)
        Finally
            ' Perform any tidy up code.
        End Try
    End Sub


    Private Sub ListView1_ItemActivate(sender As System.Object, e As System.Windows.Forms.ListViewItemSelectionChangedEventArgs) Handles ListView1.ItemSelectionChanged

        TextBox2.Text = e.Item.SubItems(1).Text
    End Sub

    Private Sub TextBox1_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        If e.KeyCode = Keys.Enter Then
            'Runs the Button1_Click Event
            Button1_Click(Me, EventArgs.Empty)
        End If
    End Sub

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    End Sub



    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click, ClearToolStripMenuItem.Click
        ListView1.Items.Clear()
    End Sub

    Private Sub DownloadGPDToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles DownloadGPDToolStripMenuItem.Click, DownloadGPDToolStripMenuItem1.Click

        Dim gpds As ArrayList = New ArrayList()

        Const YOUR_DIRECTORY As String = "****"

        ' Get the object used to communicate with the server.
        Dim request As FtpWebRequest = CType(WebRequest.Create(YOUR_DIRECTORY), FtpWebRequest)
        request.Method = WebRequestMethods.Ftp.ListDirectoryDetails
        ' This example assumes the FTP site uses anonymous logon.
        request.Credentials = New NetworkCredential("****", "****")

        Call wait(1500)

        Dim response As FtpWebResponse = CType(request.GetResponse, FtpWebResponse)
        Dim responseStream As Stream = response.GetResponseStream
        Dim reader As StreamReader = New StreamReader(responseStream)
        Dim s = reader.ReadToEnd

        reader.Close()
        response.Close()

        If Len(TextBox2.Text) > 0 Then
            If s.Contains(TextBox2.Text + ".gpd") Then
                FolderBrowserDialog1.ShowDialog()

                If Not FolderBrowserDialog1.SelectedPath = Nothing Then

                    Me.Text = "Game Finder | By Unh0ly | Downloading..."
                    Me.ToolStripStatusLabel1.Text = "Downloading..."
                    My.Computer.Network.DownloadFile("****" + TextBox2.Text + ".gpd", FolderBrowserDialog1.SelectedPath + "\" + TextBox2.Text + ".gpd", "", "", False, "100", True)
                    Me.ResetText()
                    Me.ToolStripStatusLabel1.Text = "Status.."
                ElseIf FolderBrowserDialog1.SelectedPath = Nothing Then

                Else
                    MessageBox.Show("No GPD for Selected Game")
                End If
            Else
                MessageBox.Show("No GPD for Selected Game")
            End If
        Else
            ' Do Nothing
        End If
    End Sub

    Private Sub ExitToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles ExitToolStripMenuItem.Click
        Application.Exit()
    End Sub

    Private Sub CheckForUpdatesToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles CheckForUpdatesToolStripMenuItem.Click
        Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("****")
        Dim response As System.Net.HttpWebResponse = request.GetResponse()

        Dim sr As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream())

        Dim newestversion As String = sr.ReadToEnd()
        Dim currentversion As String = Application.ProductVersion

        Dim request1 As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("****")
        Dim response1 As System.Net.HttpWebResponse = request1.GetResponse()

        Dim sr1 As System.IO.StreamReader = New System.IO.StreamReader(response1.GetResponseStream())

        Dim updurl As String = sr1.ReadToEnd()

        If newestversion.Contains(currentversion) Then
            MessageBox.Show("You have the current version", "Up to date", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Else
            Dim result1 As DialogResult = MessageBox.Show("Newer version available" & vbCrLf & "Please Goto *** to check" + vbCrLf + "Do you want to go there now?", "Update Available", MessageBoxButtons.YesNo, MessageBoxIcon.Information)

            If result1 = DialogResult.Yes Then
                Process.Start(updurl)
            Else
                ' Do Nothing
            End If
        End If
    End Sub

    Private Sub AboutToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles AboutToolStripMenuItem.Click
        Dim gpds As ArrayList = New ArrayList()

        Const YOUR_DIRECTORY As String = "****"


        Dim request As FtpWebRequest = CType(WebRequest.Create(YOUR_DIRECTORY), FtpWebRequest)
        request.Method = WebRequestMethods.Ftp.ListDirectoryDetails

        request.Credentials = New NetworkCredential("****", "****")

        Call wait(100)

        Dim response As FtpWebResponse = CType(request.GetResponse, FtpWebResponse)
        Dim responseStream As Stream = response.GetResponseStream
        Dim reader As StreamReader = New StreamReader(responseStream)
        Dim s = reader.ReadToEnd

        reader.Close()
        response.Close()

        Dim Lines() As String = s.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)

        MessageBox.Show("Made By Unh0ly aka Nickdudego3" & vbCrLf & "Number of GPD's: " & Lines.Length - 5 & vbCrLf & "Version: " & Application.ProductVersion, "About", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
    End Sub
End Class

2 个答案:

答案 0 :(得分:1)

以下是一个如何使用工人的小样本..

    Friend WithEvents myWorker As System.ComponentModel.BackgroundWorker
    Me.myWorker = New System.ComponentModel.BackgroundWorker()

  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
     myWorker.RunWorkerAsync()
  End Sub

  Private Sub myWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles myWorker.DoWork
  'do your stuff here...
  End Sub

答案 1 :(得分:0)

在代码中找到瓶颈的最佳方法是在方法周围添加Timer.StartTimer.Stop,以找出执行时间最长的方法。

找到有问题的方法后,可以使用ThreadPool.QueueUserWorkItem来实现基本的背景线程。线程绝非易事,你需要一些时间来弄清楚当你玩线程时发生的所有疯狂和奇怪的事情。

希望这会有所帮助。如果您还有其他问题,请询问。