2016-04-06 3 views
-1

У меня есть основная форма в vb.net с кнопкой, и при нажатии этой кнопки будет показан диалог Windows, который содержит другую кнопку. При щелчке по кнопке в диалоговом окне мне нужно отправить электронное письмо и закрыть диалоговое окно.VB.NET отправка электронной почты в отдельном потоке

Вот проблема

электронной отправки занимает около 5 до 6 секунд. Мне нужно закрыть диалоговое окно, прежде чем отправлять письмо. Я думаю о том, чтобы отправить электронную почту в поток. Каков наилучший способ достичь этого? Можете ли вы отправить образец кода? Что произойдет, если поток запущен, когда диалог был закрыт?

Кроме того, было бы лучше использовать фонаря вместо этого? Я не уверен, что потоки - лучший способ это сделать.

+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

 Смежные вопросы

  • Нет связанных вопросов^_^