如:有两个线程用来发送邮件:
程序开始执行
线程一开始发送邮件,邮件发送完成后休眠1分钟,线程二(接着工作)删除线程一发送完成的邮件记录(记录在数据库的数据表中)删除完成进入休眠(1分钟)状态,线程一(进入工作状态)继续工作……如此协同循环工作。注:系统中如果有新邮件就发送,如果没有线程就等待。我的设想是:线程每一分钟检查一次。
线程一 ----->  线程二 ----->  线程一 -----> 线程二 ---->……
请各位大虾帮帮忙,谢谢!

解决方案 »

  1.   

    delegate 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    }
    网上找到的异步发送的情况可怎么让它循环工作?除非用户把这个程序关闭否则它就永远处于工作待命状态?
      

  2.   

    还是在网上找到了类似的发送邮件的例子,供大家参考咯!
    希望对读者有所帮助~~~~~~~~~
    public void SendMails()
    ...{
        jmail.MessageClass MyMail = new jmail.MessageClass();
        string SendTos=SendTo.Text.Trim();  //发送人
        string CcTos=CcTo.Text.Trim();      //抄送人
        string[] Receiver=System.Text.RegularExpressions.Regex.Split(SendTos+CcTos,",");  //总收件人
        string FromMail="[email protected]";//发件人
        string Title="你好"; //邮件主题
        string Body="附件里是重要文档,请查收!";   //邮件主体
        string ShowName="ustbwuyi";//显示名字
        //取email的@前面部分为用户名,即ustbwuyi1,当然也可以自己设置.
        string MailUserName=FromMail.Substring(0,FromMail.IndexOf("@"));
        string MailPassword="ustbwuyi";
        if(SendTos!="" || CcTos!="")
        ...{
            // 字符集
            MyMail.Charset = "GB2312";
            //附件的编码格式
            MyMail.Encoding = "BASE64";
            //是否将信头编码成iso-8859-1字符集
            MyMail.ISOEncodeHeaders = false;
            //发送人邮件地址
            MyMail.From = FromMail;
            //发送人姓名
            MyMail.FromName = ShowName;
            // 邮件主题
            MyMail.Subject =Title;
            //身份验证的用户名
            MyMail.MailServerUserName = MailUserName;
            //用户密码
            MyMail.MailServerPassWord = MailPassword;
            //邮件内容
            MyMail.Body = Body;
            ArrayList FileNames;
            //如果存在附件
            if(FileNames.Count>=1)
            ...{
                //添加附件
                string Filename;
                for(int k=0;k<FileNames.Count;k++)
                ...{
                    Filename=FileNames[k].ToString();
                    MyMail.AddAttachment(Filename,false,HttpUtility.UrlDecode(Filename.Substring(Filename.LastIndexOf(".")+1,3)));
                }            
            }        try
            ...{
                //循环发送
                for(int i=0;i<Receiver.Length;i++)
                ...{
                    MyMail.AddRecipient(Receiver[i],"","");
                    MyMail.Send("Mail.rshi.cn",false);
                }
                        
            }
            catch(Exception ex)
            ...{
                Response.Write("邮件发送失败,请您检查网络或物理连接");
            }
        }
    }
      

  3.   

    public void ReceiveMails(string Username)
    ...{
        jmail.Message Msg=new jmail.Message();
        jmail.POP3 jpop = new jmail.POP3();
        jmail.Attachments atts;
        jmail.Attachment att;
                
        //username为用户名,该方法通过用户名获取该用户的pop设置,即用户的POP用户名,密码,POP服务器地址以及端口号这四个参数,这四个参数是连接POP服务器的必用参数.
        SqlDataReader dataReader = this.ExtGetSetting(Username);
        if(dataReader.Read())
        ...{
            if(dataReader["PopServer"].ToString()!=""&&dataReader["PopUsername"].ToString()!="")
            ...{
                //连接POP服务器
                jpop.Connect(dataReader["PopUsername"].ToString(),dataReader["PopPassword"].ToString(),dataReader["PopServer"].ToString(),Int32.Parse(dataReader["PopPort"].ToString()));
                //如果服务器上有邮件
                if(jpop.Count>=1)
                ...{
                    for(int i=1;i<=jpop.Count;i++)
                    ...{
                        Msg = jpop.Messages[i];
                        atts=Msg.Attachments;                    //取数据库中邮件信息中的最大发送时间,即最近接收到的一封邮件的时间
                        Database dbase=new Database();
                        DataTable data=dbase.GetDataTable("select max(MailSendDate) as MailSenderDate from TabMailList where MailTypeFlag='1'");
                                    
                        //对服务器上的邮件的发送时间和数据库最近一封邮件的时间进行比较,如果大那么证明该邮件还未被收取,是一封新邮件,这样避免重复收取邮件入库
                        if(Msg.Date>Convert.ToDateTime(data.Rows[0][0].ToString()))
                        ...{
                            //将这封新邮件的信息保存到数据库
                            this.SaveExtMail(Msg,Username,dataReader["Email"].ToString(),jpop.GetMessageUID(i));
                                
                            //获取附件上传到服务器并且将信息存入数据库
                            if(atts.Count>=1)
                            ...{
                                for(int k=0;k<atts.Count;k++)
                                ...{
                                    att=atts[k];//获得附件
                                    string attname=att.Name;
                                    try
                                    ...{
                                        Random TempNameInt    = new Random(); 
                                        string NewMailDirName  = TempNameInt.Next(100000000).ToString();
                                        Directory.CreateDirectory(System.Web.HttpContext.Current.Server.MapPath(".")+"AttachFiles"+Username+""+NewMailDirName);
                                        string mailPath="AttachFiles"+Username+""+NewMailDirName+""+attname;
                                        att.SaveToFile(System.Web.HttpContext.Current.Server.MapPath(".")+mailPath); 
                                        //获取该封邮件在数据库的ID,以便和附件信息相对应,取邮件表中的最大ID即可
                                        int mailID=this.GetMailID();
                                        //将附件信息存入数据库
                                        this.AttExtSend(mailID,attname,att.Size,mailPath,Msg.From);
                                    }
                                    catch(Exception ex)
                                    ...{
                                        throw new Exception(ex.Message);
                                    }
                                }
                            }
                        }
                    }
                }
                //删除服务器上的邮件
                jpop.DeleteMessages();
                //断开连接
                jpop.Disconnect();
            }
        }
    }
    做事要有始有终,岂能光发送不接收?之理!
    仅供参考!