2011-10-03 2 views
0

Я немного noobie с vb.net, и я сделал это приложение, которое выполняет множество запросов HTTP и чтение потока. Но когда он это делает, он всегда зависает от моего приложения.VB.Net Фоновые работники в моем коде?

Так что я сделал небольшое исследование и обнаружил, что могу использовать фоновых работников для решения этой проблемы. Но я не знаю, с чего начать. Поэтому, если бы вы могли посмотреть на мой код и рассказать мне, где и как я могу добавить фоновых работников, чтобы предотвратить замораживание, это было бы потрясающе.

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 

ответ

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 
+0

Thats as simple as it get. Фоновые работники по-прежнему не входят в поток пользовательского интерфейса, поэтому, если вам нужно поговорить с пользовательским интерфейсом, вам нужно вызвать элемент управления. – Jeremy

+0

Также посмотрите на этот вопрос: http://stackoverflow.com/questions/202481/how-to-use-httpwebrequest-net-asynchronously – Jeremy

0

Лучший способ найти горлышко бутылки в вашем коде, чтобы положить Timer.Start и Timer.Stop вокруг ваших методов, чтобы выяснить, какие методы занимая дольше всего, чтобы искупить.

Как только вы найдете методы оскорбления, вы можете использовать ThreadPool.QueueUserWorkItem для реализации базовой поточной обработки. Threading отнюдь не просто, и вам потребуется некоторое время, чтобы вы поняли все сумасшедшие и странные вещи, которые происходят, когда вы играете с нитками.

Надеюсь, это поможет. Если у вас есть еще вопрос, спросите.

+0

Вы можете легко использовать бесплатный .Net-профайлер и не ставить 'Timer.Start' ужас внутри вашего приложения (например, http://eqatec.com/Profiler/Overview.aspx) – Jeremy

+0

@JeremyChild Спасибо за отзыв. – alykhalid

Смежные вопросы