C#: 异 步 操 作 如 何 获 知 结 果

KaKaKaKa 2010-01-27 12:01:21
写了个发EMail的方法包装成了类,我发送时是用异步形式发送的,请蚕开下面代码,问题我已经写在注释中了:


static MailMessage myMail = new MailMessage();
static SmtpClient mySmtpClient;

public bool SendMail(string from,string displayName,string mailPwd,string to,string cc,string bcc,string subject,string body)
{
myMail.From = new MailAddress(from, displayName);
myMail.To.Add(new MailAddress(to));
myMail.Subject = subject;
myMail.SubjectEncoding = Encoding.UTF8;
myMail.Body = body;
myMail.BodyEncoding = Encoding.UTF8;
myMail.IsBodyHtml = true;
myMail.Priority = MailPriority.High;
myMail.CC.Add(new MailAddress(cc));
myMail.Bcc.Add(new MailAddress(bcc));
mySmtpClient = new SmtpClient("smtp." + myMail.From.Host, 25);
mySmtpClient.Credentials = new NetworkCredential(from, mailPwd);
mySmtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
mySmtpClient.EnableSsl = true;
mySmtpClient.SendCompleted += new SendCompletedEventHandler(mySmtpClient_SendCompleted);
mySmtpClient.SendAsync(myMail, myMail); //这里是异步发送
return true; //到这里真正发送成功了么?
}

void mySmtpClient_SendCompleted(object sender, AsyncCompletedEventArgs e)
{
if (e.Cancelled)
{
//取消了,自然没发送成功。
return;
}
//这里才是真正成功了,可是当主程序调用这个类的SendMail函数时,怎么才能知道这里成功了呢?
}

...全文
180 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bonylee 2010-01-27
  • 打赏
  • 举报
回复
e.Error? e.Result?
路人乙e 2010-01-27
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/office/wkays279.aspx
http://hi.baidu.com/davidgoo/blog/item/b1ee27dc2b76a8d38c102963.html
Alden 2010-01-27
  • 打赏
  • 举报
回复
用事件通知很方便
rightmin 2010-01-27
  • 打赏
  • 举报
回复
其实你的要求已经变成了同步发送了,对不对?

现在的问题就是如何把异步操作变成同步操作?

我的建议是使用线程等待机制。

AutoResetEvent类的使用:

AutoResetEvent waiter = new AutoResetEvent(false);
waiter.WaitOne();//阻止当前线程
waiter.Set();//使被阻止的地方继续执行

设置一个全局的bool result变量,在SendCompleted事件这里设置这个值,在SendMail方法返回这个值。

mySmtpClient.SendAsync(myMail, myMail); //这里是异步发送
waiter.WaitOne();//阻止当前线程
return result;

void mySmtpClient_SendCompleted(object sender, AsyncCompletedEventArgs e)
{
if (e.Cancelled)
{
//取消了,自然没发送成功。
result=false;
return;
}
//这里才是真正成功了,可是当主程序调用这个类的SendMail函数时,怎么才能知道这里成功了呢? result=true;

}


ZSW53362465 2010-01-27
  • 打赏
  • 举报
回复
看你的需求了,发送邮件的时候需要主程序等待么?如果不需要等待的话,把返回值去掉吧,用事件来通知发送结果
如果需要等待的话(比如有个进度条啊什么的),那用信号处理吧
KaKaKaKa 2010-01-27
  • 打赏
  • 举报
回复
用事件通知很方便
---------------
在回调函数中用事件去通知的话,那要有个等待过程的,并不是当SendMail方法结束后立即得到结果的,那我主程序不可能停下来等吧?

e.Error? e.Result?
-----------------------
这也是在回调函数里的啊?

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧