检查表单是否从 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 时引发的事件 - 不会在该对话框之前执行已关闭。