Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 函数运行后将表单发送回_Vb.net_Backgroundworker - Fatal编程技术网

Vb.net 函数运行后将表单发送回

Vb.net 函数运行后将表单发送回,vb.net,backgroundworker,Vb.net,Backgroundworker,我有以下代码部分: Public Sub SendTestEmail() Try Dim Mail As New MailMessage Mail.Subject = "Test email" Mail.To.Add(smtpTXTsendto.Text) Mail.From = New MailAddress(smtpTXTusername.Text) Mail.Body = "This is a te

我有以下代码部分:

Public Sub SendTestEmail()
    Try
        Dim Mail As New MailMessage

        Mail.Subject = "Test email"
        Mail.To.Add(smtpTXTsendto.Text)

        Mail.From = New MailAddress(smtpTXTusername.Text)
        Mail.Body = "This is a test message"


        Dim SMTP As New SmtpClient(smtpTXTserver.Text)
        If smtpCHECKssl.Checked = True Then
            SMTP.EnableSsl = True
        Else
            SMTP.EnableSsl = False
        End If
        SMTP.Credentials = New System.Net.NetworkCredential(smtpTXTusername.Text, smtpTXTpassword.Text)
        SMTP.Port = smtpTXTport.Text
        SMTP.Send(Mail)
        MessageBox.Show("A test email has been sent." & Environment.NewLine & Environment.NewLine & "To: " & smtpTXTsendto.Text & Environment.NewLine & "From: " & smtpTXTusername.Text & "." & Environment.NewLine & Environment.NewLine & "If you did not recieve an email, please check your settings and try again.", "Test Email")
    Catch ex1 As Exception
        MessageBox.Show(ex1.Message)
        Return
    End Try
End Sub
SendTestEmail
在后台工作程序内部调用

我遇到的奇怪问题是,当出现
消息框时,我单击
OK
表单会被发送到屏幕的后面,所有应用程序的后面

我尝试添加了一个
Me.focus
,但它给了我关于交叉踏板违规的问题

知道为什么会这样吗

后台工作代码:

Private Sub BGWSendTestEmail_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGWSendTestEmail.DoWork
    SendTestEmail()
End Sub
Private Sub BGWSendTestEmail_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BGWSendTestEmail.RunWorkerCompleted
    If (e.Cancelled) Then
        MsgBox("Something went wrong!")
    Else
        GroupBoxTesting.Visible = False
        Me.Enabled = True
    End If
End Sub
Private Sub SMTPButtonTest_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SMTPButtonTest.Click
    GroupBoxTesting.Visible = True
    Me.Enabled = False
    BGWSendTestEmail.RunWorkerAsync()
End Sub

将BGWSendTestEmail\u RunWorkerCompleted更改为类似的内容,并从SendTestEmail中删除异常处理

Me.Enabled = True ' Always enable form first after completed

If e.Error Is Nothing Then

            If Not e.Cancelled Then
                MessageBox.Show("A test email has been sent." _
                                & Environment.NewLine _
                                & Environment.NewLine _
                                & "To: " & smtpTXTsendto.Text _
                                & Environment.NewLine _
                                & "From: " & smtpTXTusername.Text _
                                & "." & Environment.NewLine _
                                & Environment.NewLine _
                                & "If you did not recieve an email, please check your settings and try again.", _
                                "Test Email")

                GroupBoxTesting.Visible = False 'Maybe put this also into start of method?
            Else
                MsgBox("Something went wrong!")
            End If
Else
            MessageBox.Show("Email sending failed. Exception: " & e.Error.Message)
End If

如果调试此程序,调试器将在do_work方法中附加异常,但如果在没有调试器的情况下运行它,则在completed方法中处理异常。

我建议从SendTestEmail方法中删除messagebox,并将其添加到UI方法中。最好将UI逻辑与业务逻辑分开。这也可能会消除你的奇怪问题。不知道你的意思是什么?我还能把它放在哪里?我的意思是,在这个“测试”中,UI逻辑将发生在哪里?不要在工作线程上显示消息框,它与应用程序中的其余窗口没有Z顺序关系。它也同样可能丢失或消失在另一个用户看不见的窗口后面。删除try/catch,改为使用RunWorkerCompleted事件处理程序中的e.Error属性。感谢您的评论,Hans,我将尝试一个错误,看看我是否理解您在这里写的内容。问题是您从工作线程而不是UI线程调用控件-这就是问题所在。我将长消息拆分为更易于维护的格式。如果你愿意,可以用旧的。在Hans提到他的评论后,我还改变了If-orders,使正常过程在If块中,异常行为在else块中。我实际上想出了一些类似的方法。但是谢谢你!它现在工作得很好,现在我知道要防止BG工作程序出现UI事件。编辑,如果SMTP设置不正确,它现在会出错。它在SMTP.Send(MAIL)之后立即出错,并突出显示“SendTestEmail”的“End Sub”。它的行为类似于在Visual Studio中运行实际程序以查看生产行为。在运行调试器时,代码将在SendTestEmail的End Sub上停止。这是如果我故意破坏设置。请看这里: