как остановить приложение от выхода до отправки почты через SmtpMailClient.SendAsync () - PullRequest
2 голосов
/ 25 августа 2011

У меня проблема с отправкой почты через SmtpMailClient.SendAsync (), т. Е. Если приложение закрывается сразу после SmtpMailClient.SendAsync (), почта не отправляется.

Так как заставить приложение не закрываться до обратного вызова?

Спасибо !!

Ответы [ 4 ]

0 голосов
/ 26 августа 2011

Я думаю, что вопрос на самом деле: как перехватить команду выхода и отложить ее в зависимости от состояния приложения?

Для WinForms:

protected override void OnFormClosing(FormClosingEventArgs e) 
{ 
    if (isSending) 
    { 
        quitOnSent = true; // make it so the quit will eventually happen
        e.Cancel = true; // prevent the quit for now
    } 
    base.OnFormClosing(e); 
} 

void SmtpClient_OnCompleted(object sender, AsyncCompletedEventArgs e)
{
    if(quitOnSent) this.Close(); // now quit
}
0 голосов
/ 25 августа 2011

Добавьте обработчик события SendCompleted http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.sendcompleted.aspx в ваш объект SmtpClient.

0 голосов
/ 26 августа 2011

Наконец сделал это с помощью переменной bool, чтобы определить, отправлено письмо или нет.

код:

   public static bool mailsent ;

   // I am not posting the mail sending code as its available every where.

    private void sendMailComplete(Object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {

        MailMessage msd = e.UserState as MailMessage;

        if (!e.Cancelled) 
        {
            MessageBox.Show("Cancelled");
        }
         if (e.Error != null)
        {
            MessageBox.Show("Error");

        }

        else
        {
            mailsent = true;
        }

    }

Теперь в событии FormClosing

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e){

        if (!mailsent)
        {
            MessageBox.Show("Please wait, Mail Sending in Process !!! ");
            e.Cancel = true;
        }
    }

Надеюсь, это поможет !!

0 голосов
/ 25 августа 2011

SmtpClient имеет событие SendCompleted. Вот пример кода о том, как его реализовать: http://www.systemnetmail.com/faq/4.6.aspx

В зависимости от вашей платформы вам необходимо реализовать какой-либо объект Application, который подсчитывает ожидающие операции SendAsync и позволяет приложению завершиться, только если они равны 0.

...