2016-04-06 9 views
-1

Ich habe eine Hauptform in vb.net mit einer Schaltfläche und nach Klicken auf diese Schaltfläche wird ein Windows-Dialogfeld angezeigt, das eine andere Schaltfläche enthält. Mit einem Klick auf den Button im Dialog muss ich eine Email senden und den Dialog schließen.VB.NET Senden von E-Mail in einem separaten Thread

Hier ist das Problem

Die E-Mail zu senden dauert etwa 5 bis 6 Sekunden. Ich muss den Dialog schließen, bevor ich die E-Mail sende. Ich denke daran, die E-Mail in einen Thread zu schicken. Was ist der beste Weg, dies zu erreichen? Können Sie bitte einen Beispielcode senden? Was passiert, wenn der Thread beim Schließen des Dialogfelds ausgeführt wird?

Ist es auch besser, stattdessen einen Hintergrundarbeiter zu verwenden? Ich bin mir nicht sicher, ob Threading der beste Weg ist.

+0

Ich habe versucht, die E-Mail zu senden als Thread ausgeführt. Dies löst das Problem der Reaktionsfähigkeit und der Dialog wird sofort geschlossen. Ich erhalte jedoch zeitweilige Fehler wie diese: "Fehler aufgetreten (SendEmail): Fehler beim Erstellen des Fensterhandle". Ich bin mir nicht sicher, ob dies daran liegt, dass der Thread im Dialogfeld deklariert wurde und der Dialog geschlossen wurde, bevor der Thread beendet wurde. –

Antwort

0

Versuchen Sie, diese

Public Class libMail 

    Private WithEvents bw As New BackgroundWorker 

    Public Sub BackgW() 
     bw.RunWorkerAsync() 
    End Sub 

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles bw.DoWork 

     SendMail("Subject", "SendingMail") 

    End Sub 

     Public Shared Function CheckForInternetConnection() As Boolean 


     Try 
      Return My.Computer.Network.Ping("www.google.com") 
     Catch 
      Return False 
     End Try 

    End Function 

    Public Function SendMail(subject As String, msg As String) As String 
     Try 

      Select Case CheckForInternetConnection() 
       Case True 

        Dim smtpServer As New SmtpClient 
        Dim eMail As New MailMessage() 
        smtpServer.UseDefaultCredentials = False 
        smtpServer.Credentials = New System.Net.NetworkCredential("YourMail", "yourPassword") 
        smtpServer.Port = 587 
        smtpServer.EnableSsl = True 
        smtpServer.Host = "smtp.gmail.com" 


        eMail = New MailMessage() 
        eMail.From = New MailAddress("yourMail") 
        eMail.To.Add("MailToSend") 
        eMail.Subject = subject 

        eMail.IsBodyHtml = False 
        eMail.Body = msg 
        smtpServer.Send(eMail) 

        Return "SENT" 
      End Select 
      Return Nothing 
     Catch ex As Exception 

      Return Nothing 
     End Try 

    End Function 

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles bw.RunWorkerCompleted 

      'do some work when is over 
    End Sub 

    End class 

‚nennen

 Using l As New libMail 
      l.BackgW() 
      'CLOSE FORM 
     End Using 
+0

Hallo danke! Aber in diesem Fall müsste ich das Formular nur in BackgroundWorker1_RunWorkerCompleted schließen, oder? Ist es möglich, so etwas zu tun? Schritt 1. Rufen Sie l.BackgW, Schritt 2 auf. Schließen Sie den Dialog. –

+0

@ RaymondWee ja es ist – Dejan

Verwandte Themen