2016-08-16 68 views
1

因此,我前段時間做了類似的事情,但這本質上是一個(特定)網站的用戶名檢查器,它們可以通過文本文件加載用戶名,它會把它變成一個列表框,現在我有了開始按鈕,它意味着檢查每個用戶名。然而,之前,他們在檢查時凍結了程序,但它工作正常。我試圖讓它「穿線」,所以它不會凍結。線程在結束線程循環之前沒有完成任務

現在的問題是,它不檢查所有,並立即完成。

CODE:

Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click 
    Button6.Enabled = False 
    Dim goodUsers As New SaveFileDialog() 
    goodUsers.Filter = "TXT file (*.txt)|*.txt" 
    Dim flag As Boolean 
    Dim Incomplete As Integer = 0 
    Dim Taken As Integer = 0 
    Dim sb As New StringBuilder 
    If goodUsers.ShowDialog() = DialogResult.OK Then 
     Dim checkerMT As New Thread(
      Sub() 
       For Each i As String In UsernameList.Items 
        WebRequest.Create("http://yatobooter.cf/other/checkusr.php?username=" + i.ToString) 

        Dim cResult As String = New System.Net.WebClient().DownloadString("http://yatobooter.cf/other/checkusr.php?username=" + i.ToString).ToString 

        If cResult = "taken" Then 
         flag = False 
        ElseIf cResult = "nottaken" Then 
         flag = True 
        End If 

        If flag = True Then 
         sb.Append(i & vbNewLine) 
        Else 
         Incomplete = Incomplete + 1 
         Taken = UsernameList.Items.Count - Incomplete 
        End If 
       Next 
      End Sub 
     ) 
     checkerMT.Start() 
     Try 
      File.WriteAllText(goodUsers.FileName, sb.ToString) 
     Catch ex As Exception 
      Exit Sub 
     End Try 
    End If 
    MessageBox.Show("Checking available usernames, complete!", "NameSniper Pro") 
    Button6.Enabled = True 
End Sub 
+2

嗯是的......你開始建立'StringBuilder'的線程,但是立即將'StringBuilder'的內容寫入文件,而不用等待線程完成。你是如何期望這項工作的?你需要把文件寫入線程中,並且只顯示一個消息框,當它完成時它就完成了。 –

+0

此外,這裏不是問題,但完全忽略它們捕獲的異常的「Catch」塊幾乎不是一個好主意。當你試圖調試未來的問題時,他們會*不會*幫助你,而你所知道的僅僅是例如該文件實際上並沒有寫入。 –

+0

做'新的System.Net.WebClient()。DownloadString(...)'是內存泄漏。你應該處理'System.Net.WebClient()'。 – Enigmativity

回答

-1
  1. 的SaveFileDialog可以用作 「使用指令」

  2. 爲什麼你創建一方面的WebRequest ,另一方面使用webclient?這根本沒有意義。

  3. 而不是你纔怪條件的,寫:

標誌=(cResult.Equals( 「nottaken」))

  • 你想要的所有代碼在你的線程中當前運行的動作也必須在你的線程中運行,因爲它是異步的。
  • 你,如果你使用一個線程 等內的用戶控件調用..

  • 請打開選項嚴格上和Option推斷關

    有很多其他事情你可以做得更好。 請自行刪除webrequest和webclient組合,這根本沒有意義。從比其他UI線程

    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click 
    
        Dim Incomplete As Integer = 0 
        Dim Taken As Integer = 0 
        Dim sb As New StringBuilder 
    
        Using goodUsers As SaveFileDialog = new SaveFileDialog() 
        goodUsers.Filter = "TXT file (*.txt)|*.txt" 
    
        If not goodUsers.ShowDialog() = DialogResult.OK Then Exit Sub 
         Dim checkerMT As New Thread(
          Sub() 
    
          Me.invoke(sub() 
         Button6.Enabled = False 
           For Each i As String In UsernameList.Items 
            WebRequest.Create("http://yatobooter.cf/other/checkusr.php?username=" + i.ToString) 
    
            Dim cResult As String = New System.Net.WebClient().DownloadString("http://yatobooter.cf/other/checkusr.php?username=" + i.ToString).ToString 
    
            If (cResult.toLower().Equals("nottaken")) Then 
             sb.Append(String.Concat(i , Environment.NewLine) 
            Else 
             Incomplete += 1 
             Taken = UsernameList.Items.Count - Incomplete 
            End If 
    
           Next 
           File.WriteAllText(goodUsers.FileName, sb.ToString) 
           Button6.Enabled = True 
           MessageBox.Show("Checking available usernames, complete!", "NameSniper Pro") 
          End Sub) 
          End Sub 
         ) 
         checkerMT.IsBackground = True; 
         checkerMT.Start() 
    
    
    End Sub 
    
    +1

    在這裏有很多好的一點,但你開始後臺線程立即調用它回到UI線程。 – FloatingKiwi

    +0

    你會怎麼做? – SiriSch

    1

    您不能訪問UI元素(UsernameList.Items):

    看看這個,我清除了一點點。相反,請在您的表單中添加一個後臺工作人員來處理基本的線程工作(進度報告,完成報告,異常處理)。傳遞給這個包含您的工作需要完成其工作而不與UI交互的設置的對象。

    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click 
        Button6.Enabled = False 
        Dim goodUsers As New SaveFileDialog() 
        goodUsers.Filter = "TXT file (*.txt)|*.txt" 
    
        If goodUsers.ShowDialog() = DialogResult.OK Then 
         'Note: You'll need to add the filenames 
         BackgroundWorker1.RunWorkerAsync(New State() With {.Names = {}, .FileName = goodUsers.FileName}) 
        End If 
    
    End Sub 
    
    Class State 
        Public Names As List(Of String) 
        Public StringBuilder As New System.Text.StringBuilder 
        Public Incomplete As Integer 
        Public Taken As Integer 
        Public FileName As String 
    End Class 
    
    Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
        Dim state = CType(e.Argument, State) 
        For Each i As String In state.Names 
    
         Using cli = New System.Net.WebClient() 
    
          Dim cResult = cli.DownloadString("http://yatobooter.cf/other/checkusr.php?username=" + i.ToString).ToString 
          If cResult = "nottaken" Then 
           state.StringBuilder.Append(i & vbNewLine) 
          Else 
           state.Incomplete = state.Incomplete + 1 
           state.Taken = state.Names.Count - state.Incomplete 
          End If 
    
         End Using 
        Next 
        IO.File.WriteAllText(state.FileName, state.StringBuilder.ToString) 
    End Sub 
    
    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 
        If e.Error IsNot Nothing Then 
         MessageBox.Show(e.Error.ToString(), "Error") 
        Else 
         MessageBox.Show("Checking available usernames, complete!", "NameSniper Pro") 
        End If 
        Button6.Enabled = True 
    End Sub 
    
    相關問題