2016-04-06 11 views
-1

私はvb.netのメインフォームをボタンで持っています。そのボタンをクリックすると別のボタンを含むWindowsダイアログが表示されます。ダイアログのボタンをクリックすると、電子メールを送信してダイアログを閉じる必要があります。VB.NETは別のスレッドで電子メールを送信します

ここに問題があります

電子メールの送信には約5〜6秒かかります。メールを送信する前にダイアログを閉じる必要があります。私は電子メールをスレッドに送ることを考えています。これを達成する最良の方法は何ですか?サンプルコードを送ってください。ダイアログが閉じられたときにスレッドが実行されている場合はどうなりますか?

また、代わりにbackgroundworkerを使用する方が良いでしょうか?スレッディングが最善の方法であるかどうかはわかりません。

+0

それを呼び出す試してみてください。これにより、応答性の問題が解決され、ダイアログはすぐに終了します。しかし、次のような断続的なエラーが発生します。「発生したエラー(SendEmail):ウィンドウハンドルの作成中にエラーが発生しました。スレッドがダイアログで宣言され、スレッドが完了する前にダイアログが閉じられているため、これが原因であるかどうかはわかりません。 –

答えて

0

この

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 

は、「私はスレッドとしてメール送信を実行しようとした

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

こんにちは、ありがとう!しかし、この場合、私はBackgroundWorker1_RunWorkerCompletedでフォームを閉じる必要がありますか?このようなことは可能でしょうか?ステップ1. l.BackgWを呼び出し、ステップ2.ダイアログを閉じます。 –

+0

@RaymondWeeはい – Dejan