检查表单是否从 backgroundworker VB.NET 关闭
Checking if form closed from backgroundworker VB.NET
我的backGroundWorker.The代码有几个任务如下:
Private Sub bgworker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgworker.DoWork
connecttosrv.showDialog
Dim p() As Process
p = Process.GetProcessesByName("mssqlserver")
If p.Count > 0 Then
Else
Try
Dim p1 As Process
p1 = Process.Start("cmd.exe", "/C net start mssqlserver")
p1.WaitForExit()
Catch ex As Exception
err = ex.ToString
End Try
End If
Dim con As New SqlConnection("Data source=" & My.Settings.IP & "," & My.Settings.Port & ";Network Library=DBMSSOCN;initial catalog=offpodb;User id=" & My.Settings.username & ";Password=" & My.Settings.password & ";")
con.open
现在让我解释一下我的情况。如您所见,bgWorker 尝试使用存储在 MY.SETTINGS 中的 IP、端口、用户名和密码 连接到我的数据库.
My.Settings.IP、密码、用户名、端口的值都是空的startup.Their值是从另一个表单添加的(在这种情况下是connecttosrv,此表单有文本框,用户可以在其中输入 IP、端口、密码、用户名)。
看bgWorker的code.The第一行是:
connecttosrv.ShowDialog
如前所述,其他代码在 ConnectToSrv 具有 showed.But 之后执行,bgWorkder 尝试连接到数据库,从 My.Settings 获取所需的详细信息,并且 My.Settings 从 ConnectToSrv 表单获取值。因此,根据我的代码,bgWorker 将在完成显示 ConnectToSrv form.This 后执行其他代码将导致 SQLCONNECTION 无法连接,因为 MY.SETTINGS 值将为空。
所以我想要的帮助可以说是:
1• 是否可以让 BackGroundWorker 检查 ConnectToSrv 表单是否已关闭,以便 My.Settings 获取 SQL Connection[= 的所有必需值13=]
或
2• 是否可以在显示第二个表单 (ConnectTOSrv) 时暂停 backgroundWorker,并在表单关闭时再次恢复它。 (经过一些研究,我发现我可以设置 BgWorker 来检查 Form IsDisposed 但我不知道如何 use/apply 它)
不要在后台工作线程中执行 UI 操作。在启动后台工作程序之前执行 connecttosrv.showDialog
。
connecttosrv.showDialog
bgworker.RunWorkerAsync()
从 bgworker_DoWork
中删除 connecttosrv.showDialog
。
为了线程安全,将所有需要的参数作为参数传递给后台工作者
Public Class MyParameters
Public Property Prop1 As String
Public Property Prop2 As Integer
...
End Class
传递参数
connecttosrv.showDialog
Dim params = new MyParameters()
params.Prop1 = "hello"
params.Prop2 = 7
bgworker.RunWorkerAsync(params)
在 worker 方法中,您可以使用
访问它们
Private Sub bgworker_DoWork(ByVal sender As Object,
ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgworker.DoWork
Dim params = DirectCast(e.Argument, MyParameters)
当使用Form.ShowDialog时,它后面的代码直到表单关闭才会执行。我认为 BackgroundWorker 不是这种情况。
尝试恰好在 bgworker.RunWorkerAsync 之前调用 connecttosrv.ShowDialog(),因此 bgworker_DoWork 中的代码 - 这是调用 RunWorkerAsync 时引发的事件 - 不会在该对话框之前执行已关闭。
我的backGroundWorker.The代码有几个任务如下:
Private Sub bgworker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgworker.DoWork
connecttosrv.showDialog
Dim p() As Process
p = Process.GetProcessesByName("mssqlserver")
If p.Count > 0 Then
Else
Try
Dim p1 As Process
p1 = Process.Start("cmd.exe", "/C net start mssqlserver")
p1.WaitForExit()
Catch ex As Exception
err = ex.ToString
End Try
End If
Dim con As New SqlConnection("Data source=" & My.Settings.IP & "," & My.Settings.Port & ";Network Library=DBMSSOCN;initial catalog=offpodb;User id=" & My.Settings.username & ";Password=" & My.Settings.password & ";")
con.open
现在让我解释一下我的情况。如您所见,bgWorker 尝试使用存储在 MY.SETTINGS 中的 IP、端口、用户名和密码 连接到我的数据库.
My.Settings.IP、密码、用户名、端口的值都是空的startup.Their值是从另一个表单添加的(在这种情况下是connecttosrv,此表单有文本框,用户可以在其中输入 IP、端口、密码、用户名)。
看bgWorker的code.The第一行是:
connecttosrv.ShowDialog
如前所述,其他代码在 ConnectToSrv 具有 showed.But 之后执行,bgWorkder 尝试连接到数据库,从 My.Settings 获取所需的详细信息,并且 My.Settings 从 ConnectToSrv 表单获取值。因此,根据我的代码,bgWorker 将在完成显示 ConnectToSrv form.This 后执行其他代码将导致 SQLCONNECTION 无法连接,因为 MY.SETTINGS 值将为空。
所以我想要的帮助可以说是:
1• 是否可以让 BackGroundWorker 检查 ConnectToSrv 表单是否已关闭,以便 My.Settings 获取 SQL Connection[= 的所有必需值13=]
或
2• 是否可以在显示第二个表单 (ConnectTOSrv) 时暂停 backgroundWorker,并在表单关闭时再次恢复它。 (经过一些研究,我发现我可以设置 BgWorker 来检查 Form IsDisposed 但我不知道如何 use/apply 它)
不要在后台工作线程中执行 UI 操作。在启动后台工作程序之前执行 connecttosrv.showDialog
。
connecttosrv.showDialog
bgworker.RunWorkerAsync()
从 bgworker_DoWork
中删除 connecttosrv.showDialog
。
为了线程安全,将所有需要的参数作为参数传递给后台工作者
Public Class MyParameters
Public Property Prop1 As String
Public Property Prop2 As Integer
...
End Class
传递参数
connecttosrv.showDialog
Dim params = new MyParameters()
params.Prop1 = "hello"
params.Prop2 = 7
bgworker.RunWorkerAsync(params)
在 worker 方法中,您可以使用
访问它们Private Sub bgworker_DoWork(ByVal sender As Object,
ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgworker.DoWork
Dim params = DirectCast(e.Argument, MyParameters)
当使用Form.ShowDialog时,它后面的代码直到表单关闭才会执行。我认为 BackgroundWorker 不是这种情况。
尝试恰好在 bgworker.RunWorkerAsync 之前调用 connecttosrv.ShowDialog(),因此 bgworker_DoWork 中的代码 - 这是调用 RunWorkerAsync 时引发的事件 - 不会在该对话框之前执行已关闭。