程序不适用于不同的设备
Program doesn't work on different devices
我已经构建了一个程序来检查该应用程序是否已启用。如果启用,它将执行 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
没有改变,如果它达到了这部分代码,它一定是 "Status: Checking"。
我的代码有什么问题?同样,它在我的电脑上工作,但对其他人来说,它不工作。非常感谢任何帮助!
根据 MSDN,
You must be careful not to manipulate any user-interface objects in
your DoWork event handler. Instead, communicate to the user interface
through the BackgroundWorker events.
可能是第一行导致错误。最好在 UI 线程上调用它。参见 How to: Make Thread-Safe Calls to Windows Forms Controls
旁注:
- 您在
DoWork
中的循环似乎不正确。您正在寻找行中的标志并设置启用和禁用状态,如果多行设置或未设置标志怎么办?如果查询每次 return 只有 1 行那么你不需要这里的循环
- 您应该在
DoWork
事件处理程序中进行一些登录,以便了解内部实际发生的情况。
- 通常我们不会在
DoWork
事件处理程序中处理异常,而是使用 RunWorkerCompleted
事件来告诉您进程中是否发生任何异常。无论如何,最好使用此事件来了解该过程已完成。
我终于上班了
这是我使用的代码:
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
我已经构建了一个程序来检查该应用程序是否已启用。如果启用,它将执行 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
没有改变,如果它达到了这部分代码,它一定是 "Status: Checking"。
我的代码有什么问题?同样,它在我的电脑上工作,但对其他人来说,它不工作。非常感谢任何帮助!
根据 MSDN,
You must be careful not to manipulate any user-interface objects in your DoWork event handler. Instead, communicate to the user interface through the BackgroundWorker events.
可能是第一行导致错误。最好在 UI 线程上调用它。参见 How to: Make Thread-Safe Calls to Windows Forms Controls
旁注:
- 您在
DoWork
中的循环似乎不正确。您正在寻找行中的标志并设置启用和禁用状态,如果多行设置或未设置标志怎么办?如果查询每次 return 只有 1 行那么你不需要这里的循环 - 您应该在
DoWork
事件处理程序中进行一些登录,以便了解内部实际发生的情况。 - 通常我们不会在
DoWork
事件处理程序中处理异常,而是使用RunWorkerCompleted
事件来告诉您进程中是否发生任何异常。无论如何,最好使用此事件来了解该过程已完成。
我终于上班了
这是我使用的代码:
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