2013-11-11 4 views
0

Я пытаюсь сделать что-то, что проверяет имена пользователей Xbox, но я попытался сделать это с помощью таймера, который отстает от него. Поэтому я решил, что я делаю это с фоновым рабочим, но с разными потоками, а ссылки на пользовательский интерфейс для меня действительно не работают. Любая помощь?Threading and Background Worker

 For i As Integer = 0 To ListBox1.Items.Count 
     Using Wc As New WebClient() 
      Try 
       Dim Xbox As String = String.Empty 
       Xbox = Wc.DownloadString("http://www.xboxgamertag.com/search/" & ListBox1.SelectedItem.ToString()) 

       If Xbox.Contains("Online Status") Then 
        FlatAlertBox1.Text = "Gamertag " & ListBox1.SelectedItem.ToString & " is taken :(" 
        FlatAlertBox1.kind = FlatAlertBox._Kind.Error 
        FlatAlertBox1.Visible = True 
       End If 

      Catch ex As Exception 
       FlatAlertBox1.Text = "Gamertag " & ListBox1.SelectedItem.ToString & " is not taken!" 
       FlatAlertBox1.kind = FlatAlertBox._Kind.Success 
       FlatAlertBox1.Visible = True 
      End Try 

     End Using 
    Next 
    ListBox1.SelectedIndex += 1 

Когда я пытаюсь запустить его, я получаю:

Исключение типа «System.InvalidOperationException» произошло в System.Windows.Forms.dll, но не был обработан в пользовательском коде

Дополнительная информация: Работа с перекрестными потоками недействительна: элемент управления ListBox1 доступен из потока, отличного от потока, на котором он был создан.

Если есть обработчик для этого исключения, программа может быть безопасно продолжена.

На линии: FlatAlertBox1.Text = "Gamertag " & ListBox1.SelectedItem.ToString & " is not taken!"

+0

http://stackoverflow.com/questions/7743675/cross-thread-operation-not-valid – Plutonix

+0

, если вы в 2012 или 2013 году можете использовать [async/await] (http://msdn.microsoft.com). /en-us/library/vstudio/hh191443(v=vs.110).aspx) выполнить асинхронную выборку и остановить ее блокировку нити ui без использования потоков. – user1937198

ответ

0

Вы не можете обновить элементы управления GUI на нитку без пользовательского интерфейса, так что вам придется попробовать «отчетность» выводы во время цикла.

Здесь я просто начать нить с копией строки из ListBox:

bgw.RunWorkerAsync(ListBox1.Items.Cast(Of String)) 

Нам нужен простой класс, чтобы сообщить информацию:

Public Class UserStatus 
    Property Name As String 
    Property Kind As Integer 
End Class 

Затем в методе DoWork

Private Sub bgw_DoWork(sender As Object, e As DoWorkEventArgs) Handles bgw.DoWork 
    For Each s As String In DirectCast(e.Argument, IEnumerable(Of String)) 
    Using Wc As New WebClient() 
     Dim Xbox As String = String.Empty 
     Xbox = Wc.DownloadString("http://www.xboxgamertag.com/search/" & s) 
     If Xbox.Contains("Online Status") Then 
     bgw.ReportProgress(0, New UserStatus() With {.Name = s, .Kind = Kind.Error}) 
     Else 
     bgw.ReportProgress(0, New UserStatus() With {.Name = s, .Kind = Kind.Success}) 
     End If 
    End Using 
    Next 
End Sub 

В мероприятии ProgressChanged вы можете узнать свой статус:

Private Sub bgw_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles bgw.ProgressChanged 
    Dim us As UserStatus = DirectCast(e.UserState, UserStatus) 
    If us.Kind = Kind.Success Then 
    FlatAlertBox1.Text = "Gamertag " & us.Name & " is not taken!" 
    Else 
    FlatAlertBox1.Text = "Gamertag " & us.Name & " is taken :(" 
    End If 
    FlatAlertBox1.kind = us.Kind 
    FlatAlertBox1.Visible = True 
End Sub 

Несколько заметок о вашем коде. Вы перебираете список, но размещаете всю свою информацию в том же TextBox, чтобы вы видели только последний элемент в списке (если процесс не очень медленный).

Я удалил Try-Catch. Если в BackgroundWorker возникла ошибка, она будет сообщена в событии RunWorkerCompleted в свойстве e.Error. Вы должны изучить любые ошибки, которые произошли там.

+0

Единственная проблема, с которой я столкнулась, - это отчёт, если она была сделана или нет, во втором текстовом поле. – Frank

+0

Ничего, я получил его, большое спасибо. – Frank