我遇到通过SmtpMailClient.SendAsync()发送邮件的问题,即如果应用程序在SmtpMailClient.SendAsync()之后立即关闭,则不会发送邮件。
那么如何强制应用程序不要关闭直到回调?
谢谢!
答案 0 :(得分:0)
SmtpClient有一个SendCompleted事件。以下是有关如何实施该示例的示例代码:http://www.systemnetmail.com/faq/4.6.aspx
根据您的平台,您需要实现某种Application对象,该对象计算挂起的SendAsync操作,并且只允许应用程序在0时结束。
答案 1 :(得分:0)
向SmtpClient对象添加SendCompleted http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.sendcompleted.aspx事件处理程序。
答案 2 :(得分:0)
最后通过使用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;
}
}
希望它有所帮助!!
答案 3 :(得分:0)
我认为问题是:你如何拦截退出命令并根据应用程序状态推迟它?
对于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
}