程序不能在不同的设备上工作

问题描述:

我已经构建了一个程序来检查应用程序是否启用。如果启用,它将执行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没有改变,如果达到这部分代码就一定是“状态:检查“。

我的代码有什么问题?再次,它在我的电脑中工作,但对其他人来说,它不是。任何帮助是极大的赞赏!

按照MSDN,

你一定要小心,不要操纵 你的DoWork的事件处理程序的任何用户界面对象。而是通过BackgroundWorker事件与用户界面 通信。

可能是第一行导致错误。最好在UI线程上调用它。见How to: Make Thread-Safe Calls to Windows Forms Controls

旁注:

  1. 你在DoWork循环看起来不正确。你正在寻找一行标志并设置启用和禁用状态,如果多行有标志设置或未设置,该怎么办?如果查询每次只返回1行,那么你不需要循环这里
  2. 你应该在DoWork事件处理程序中有一些日志记录,以便你知道里面实际发生了什么。
  3. 通常我们不会在DoWork事件处理程序中处理异常,而是使用RunWorkerCompleted事件来告诉您是否在该过程中发生了任何异常。无论如何,使用这个事件是为了知道这个过程已经完成是一个好主意。
+0

所以应的代码是什么呢?我不知道该怎么做。该代码完美地运行我的电脑,但打开到另一个不会执行backgroundworker。我很困惑 –

+0

你检查链接了吗? – sallushan

+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