利用委托异步发送邮件


故事是这样发生的:

  越来越多的用户在网站购买了东西,每成功订下一个定单,就要向用户的邮箱发送一封EMAIL。当邮件正在发送时,占用的资源会非常多,用户也需要等待,用户越多,这样用户页面上的等待时间就会变得很长,为了解决这个问题,决定把发送EMAIL和短信的都改成异步执行的。

  异步发送邮件,有两种做法;一种是大家在网上一搜就能找到一堆的发送方法,这种方法都是在发送email的时候再进行异步操作,如这篇文章(http://blog.csdn.net/liuduoqing/archive/2007/12/19/1952934.aspx)中写到的。

  但是这种方法在我这里需要的成本太高,因为发送邮件的方法是封装好的,不便更改,所以只能从调用这个方法上想办法,在这里我找到了委托,可以异步调用方法,这样就可以实现了,委托的介绍在这里:http://msdn.microsoft.com/zh-cn/library/ms173171(VS.80).aspx

  闲话少叙,把示例代码先贴出来:

  Code

1delegate void DelegateName(MyEmail myEmail);
2  public class MainClass
3  {    
4    public static void Main()
5    {
6      MyEmail myEmail = new MyEmail();
7      Asnys(myEmail);      
8    }
9    public static void Asnys(MyEmail myEmail)
10    {
11      DelegateName dn = new DelegateName(SendEmail);
12      AsyncCallback ac = new AsyncCallback(NoSeleep);
13      dn.BeginInvoke(myEmail,ac, dn);
14      Console.WriteLine("这才是真的没睡");
15      Console.ReadLine();
16    }
17    private static void SleepNmin(int i)
18    {
19      Thread.Sleep(i * 1000);
20      Console.WriteLine("我睡了" + i.ToString() + "秒");
21    }
22    private static void NoSeleep(IAsyncResult iar)
23    {
24      SleepNmin(2);
25      Console.WriteLine("我可没有睡,都执行完了再叫我");
26      DelegateName dn = iar.AsyncState as DelegateName;
27
28      dn.EndInvoke(iar);
29    }
30    private static void SendEmail(MyEmail myEmail)
31    {
32      //这里发送邮件
33      Console.WriteLine("邮件发送完毕");
34    }
35  }
36  public class MyEmail
37  {
38  }

  再说一下委托的方法,委托在类内类外都可以定义,声明了委托以后,就可以使用了,把要异步执行的方法通过下面的方式给一个委托变量,

  Code

1DelegateName dn = new DelegateName(SendEmail);
2//或者
3      DelegateName dn = SendEmail;

  这样,就可以调用委托中提供的异步方法BeginInvoke来执行异步发送邮件.BeginInvoke的参数中AsyncResult callback是异步执行完成后调用的方法,

  在调用的方法中一般要执行一下EndInvoke(IAsyncResult iar),一定要执行这个,不然的话据说后果很严重.

  参数Object o是可以传入DelegateName的一个实例,指的是在当前线程上执行,也可传入null

  对委托理解不是很深,不妥之处万望指教,谢谢


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3