2016-09-17 3 views
0

Я создал программу, которая проверяет, включено ли приложение или нет. Если он включен, он выполнит BackgroundWorker, а если нет, он уведомит пользователя и немедленно закроется. Он работал для моего компьютера, но для других, он не заполняет код без ошибок.Программа не работает на разных устройствах

Вот мой код:

Dim Status As String = "" 
Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted 
    If Status = "Enabled" Or Status = "Disabled" Then 
    Else 
     Status = WebBrowser1.Document.GetElementById(Account & "Flag").InnerText.ToString 
     If Status = "Enabled" Then 
      BackgroundWorker1.RunWorkerAsync() 
     ElseIf Status = "Disabled" Then 
      MessageBox.Show("Disabled", "System", MessageBoxButtons.OK) 
      Close() 
     Else 
      Status = "" 
     End If 
    End If 
End Sub 

Для меня, я думаю, что это не начинает BackgroundWorker делать свою работу. Я проверил код, поставив MsgBox("Code 1 Success") после первой строки кода и MsgBox("Code 2 Success") после второй строки кода и так далее. И он достигает кода BackgroundWorker1.RunWorkerAsync(), но он не выполняет код в BackgroundWorker.

Вот код BackgroundWorker1:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
    Label1.Text = "Status: Checking" 
    Label1.ForeColor = Color.FromKnownColor(KnownColor.Highlight) 
    Try 
     Dim mysqlconnection As MySqlConnection = New MySqlConnection("server=85.10.205.173;port=3306;username='" & User & "';password='" & Pass & "'") 
     Dim mysqlcommand As MySqlCommand = Nothing 
     Dim mysqldatareader As MySqlDataReader = Nothing 
     mysqlconnection.Open() 
     Using table As DataTable = New DataTable 
      Using command As MySqlCommand = New MySqlCommand("Select * from login.accounts where Username = 'Jake';", mysqlconnection) 
       Using adapter As MySqlDataAdapter = New MySqlDataAdapter(command) 
        adapter.Fill(table) 
       End Using 
      End Using 

      For Each row As DataRow In table.Rows 
       If row("Flag") = "enable" Then 
        Label1.Text = "Status: Enabled" 
        Label1.ForeColor = Color.Green 
        Button1.Enabled = False 
        Button2.Enabled = True 
        ProgressBar1.Visible = False 
       Else 
        Label1.Text = "Status: Disabled" 
        Label1.ForeColor = Color.OrangeRed 
        Button1.Enabled = True 
        Button2.Enabled = False 
        ProgressBar2.Visible = False 
       End If 
      Next 
     End Using 
     mysqlconnection.Close() 
    Catch ex As Exception 
     Threading.Thread.Sleep(1000) 
     Label1.Text = "No Internet Connection" 
    End Try 
End Sub 

Я знал, что он не достигает этого кода, потому что Label1.Text не изменится, если он достигнет этой части кода это, должно быть, был «Статус : Проверка ".

В чем проблема с моим кодом? Опять же, он работает на моем компьютере, но с другими, это не так. Любая помощь очень ценится!

ответ

1

Согласно MSDN,

Вы должны быть осторожны, чтобы не манипулировать каких-либо объектов пользовательского интерфейса в обработчика событий DoWork. Вместо этого обменивайтесь с пользовательским интерфейсом событиями BackgroundWorker.

Возможно, первая строка вызывает ошибку. Лучше вызывать его в потоке пользовательского интерфейса. См How to: Make Thread-Safe Calls to Windows Forms Controls

сторона отмечает:

  1. Ваш цикл в DoWork не кажется правильным. Вы ищете флаг в строках и устанавливаете разрешения и отключите состояния, что, если несколько строк имеют установленный или не установлен флаг? Если запрос будет возвращать только по 1 строке каждый раз, тогда вам здесь не нужен цикл
  2. У вас должно быть некоторое ведение журнала событий DoWork, чтобы вы знали, что на самом деле происходит внутри.
  3. Обычно мы не обрабатываем исключение в обработчике событий DoWork, скорее используем событие RunWorkerCompleted, в котором сообщается, произошло ли какое-либо исключение в процессе или нет. Несмотря на это, рекомендуется использовать это событие, чтобы узнать, что этот процесс завершен.
+0

Так что должно быть код? Я не знаю, как это сделать. Код работает отлично для моего компьютера, но когда он открыт для другого, он не выполняет фонового рабочего. Im confused –

+0

Вы проверили ссылку? – sallushan

+0

Да. Но я не могу этого понять. –

0

я наконец сделал это работать

Вот код, я использовал:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
    BackgroundWorker1.ReportProgress(10) 
    Dim mysqlconnection As MySqlConnection = New MySqlConnection("server=85.10.205.173;port=3306;username='" & User & "';password='" & Pass & "'") 
    BackgroundWorker1.ReportProgress(20) 
    Dim mysqlcommand As MySqlCommand = Nothing 
    BackgroundWorker1.ReportProgress(30) 
    Dim mysqldatareader As MySqlDataReader = Nothing 
    BackgroundWorker1.ReportProgress(40) 
    mysqlconnection.Open() 
    BackgroundWorker1.ReportProgress(50) 
    Using table As DataTable = New DataTable 
     BackgroundWorker1.ReportProgress(60) 
     Using command As MySqlCommand = New MySqlCommand("Select * from my.accounts where Username = 'Ray';", mysqlconnection) 
      BackgroundWorker1.ReportProgress(70) 
      Using adapter As MySqlDataAdapter = New MySqlDataAdapter(command) 
       BackgroundWorker1.ReportProgress(80) 
       adapter.Fill(table) 
       BackgroundWorker1.ReportProgress(90) 
      End Using 
     End Using 

     For Each row As DataRow In table.Rows 
      If row("Flag") = "enable" Then 
       e.Result = "1" 
       BackgroundWorker1.ReportProgress(100) 
      Else 
       e.Result = "0" 
       BackgroundWorker1.ReportProgress(100) 
      End If 
     Next 
    End Using 
    mysqlconnection.Close() 
End Sub 

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged 
    If e.ProgressPercentage = 10 Then 
     Label1.Text = "Status: Checking" 
     Label1.ForeColor = Color.FromKnownColor(KnownColor.Highlight) 
    End If 
    ProgressBar1.Value = e.ProgressPercentage 
    ProgressBar1.Refresh() 
End Sub 

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 
    Threading.Thread.Sleep(500) 
    ProgressBar1.Value = 0 
    If e.Result = "1" Then 
     Label1.Text = "Status: Enabled" 
     Label1.ForeColor = Color.Green 
     Button1.Enabled = False 
     Button2.Enabled = True 
    ElseIf e.Result = "0" Then 
     Label1.Text = "Status: Disabled" 
     Label1.ForeColor = Color.OrangeRed 
     Button1.Enabled = True 
     Button2.Enabled = False 
    Else 
     MessageBox.Show("Unknown output: " & e.Result & " . Closing", "", MessageBoxButtons.OK, MessageBoxIcon.Error) 
     Close() 
    End If 
End Sub 

Благодаря @sallushan

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