现在的位置: 首页 > 综合 > 正文

循环中的线程

2013年10月10日 ⁄ 综合 ⁄ 共 2332字 ⁄ 字号 评论关闭

    在循环中创建新线程,是初学者常犯的错误。下面给出一段示例代码,注意:运行它们可能导致系统不可使用。除非不介意重启,否则最好别运行它们。

 

  1. using System;
  2. using System.Web.Mail;
  3. using System.Threading;
  4. using System.Collections;
  5. public class LoopingThreads
  6. {
  7.     public delegate void SendMail(string oMessageTo);
  8.     private class MyMail
  9.     {
  10.         public string EmailTo;
  11.         public string EmailFrom;
  12.         public String EmailSubject;
  13.         public string EmailBody;
  14.         public SendMail SendThisMail;   //delegate instance
  15.         public void Send()
  16.         {
  17.             System.Web.Mail.MailMessage oMail = new System.Web.Mail.MailMessage();
  18.             oMail.To = EmailTo;
  19.             oMail.From = EmailFrom;
  20.             oMail.Body = EmailBody;
  21.             oMail.Subject = EmailSubject;
  22.             SmtpMail.Send(oMail);
  23.             SendThisMail(EmailTo);
  24.         }
  25.     }
  26.     public static Thread CreateEmail(SendMail oSendEmail, string EmailTo, string EmailFrom, string EmailBody, string EmailSubject)
  27.     {
  28.         MyMail oMail = new MyMail();
  29.         oMail.EmailFrom = EmailFrom;
  30.         oMail.EmailBody = EmailBody;
  31.         oMail.EmailSubject = EmailSubject;
  32.         oMail.EmailTo = EmailTo;
  33.         oMail.SendThisMail = oSendEmail;
  34.         Thread t = new Thread(new ThreadStart(oMail.Send));
  35.         return t;
  36.     }
  37. }
  38. class Mailer
  39. {
  40.     public static void MailMethod(string oString)
  41.     {
  42.         Console.WriteLine("Sending Email:" + oString);
  43.     }
  44. }
  45. public class DoMail
  46. {
  47.     static ArrayList al = new ArrayList();
  48.     public static void Main()
  49.     {
  50.         for (int i = 1; i <= 1000; i++)
  51.         {
  52.             al.Add(i.ToString() + "@somplace.com");
  53.         }
  54.         SendAllEmail();
  55.     }
  56.     public static void SendAllEmail()
  57.     {
  58.         int loopTo = al.Count - 1;
  59.         for (int i = 0; i <= loopTo; i++)
  60.         {
  61.             Thread t = LoopingThreads.CreateEmail(new LoopingThreads.SendMail(Mailer.MailMethod), (string)al[i], "johndoe@somewhere.com""Threading in a loop""Mail Example");
  62.             t.Start();
  63.             t.Join(Timeout.Infinite);
  64.         }
  65.     }
  66. }

    为什么不在另一个线程上发送Email呢?它有时需要很长时间来处理,不是吗?是的,但问题是在线程之间来回切换将占用处理器的执行时间。到完成这个进程为止,分配到每个线程的时间片主要花费在拆包和打包线程本地存储上了。执行线程中的指令只花费了很少的时间。系统可能会完全锁住,无法发送Email。更合理的解决方案是创建一个线程,并在该线程上执行SendAllEmail方法。另外,再使用一个含有固定数目线程的线程池。在这个实例中,当线程池中的一个线程完成后,它将产生下一个线程,发送另一封Email。

 

[1] 在编写程序的时候,提示错误:命名空间“System.Web”中不存在类型或命名空间名称“Mail”(是缺少程序集引用吗?)

解决方法:右键解决方案资源管理器中的“引用”->添加引用->System.Web.dll,添加即可。

抱歉!评论已关闭.