要实现,用多线程群发邮件,我一下的程序效果是向所有的邮件地址重复发送了10次。
我的需求是用10个线程向所有邮件地址发送一次就可以拉。不是重复发10次。请问如何修改
代码如下:
    private   const   int   amountThread   =   10;//线程总量
        protected   void   Page_Load(object   sender,   EventArgs   e)
        {
                for   (int   i   =   0;   i   <   amountThread;   i++)
                {
                        //   创建指定数量的线程
                        //   是线程调用Run方法
                        //   启动线程
                        Thread   trd   =   new   Thread(new   ThreadStart(BatSendMail));
                        trd.Name   =   "线程"   +   i;
                        trd.Start();
                }
        }       
        private   void   BatSendMail()
        {                SqlConnection   conn   =   new   SqlConnection(ConfigurationManager.AppSettings["AppSettingConnString"].ToString());
                conn.Open();
                string   sql;
                sql   =   "select   *   from   useremai_info   ";                SqlCommand   cmd   =   new   SqlCommand(sql,   conn);
                SqlDataReader   dr   =   cmd.ExecuteReader();
                while(dr.Read())
                {                        SendMail(dr[1].ToString(),   Thread.CurrentThread.Name   +   "多线程测试"   +   DateTime.Now.ToString(),   "邮件内容");                }
       
        }
        #region   发邮件
        ///   <summary>
        ///   发送Email营销邮件
        ///   </summary>
        ///   <param   name="EmailAddress"> 收件人邮箱 </param>
        ///   <param   name="MsgTitle"> 邮件标题 </param>
        ///   <param   name="MsgArtinfo"> 邮件内容 </param>
        ///   <returns> 成功返回"true"失败返回"false" </returns>
        private   string   SendMail(string   EmailAddress,   string   MsgTitle,   string   MsgArtinfo)
        {
                string   b   =   "";                Bj5288SendEmail   _Bj5288SendEmail   =   new   Bj5288SendEmail();                b   =   _Bj5288SendEmail.SendMail5288(EmailAddress,   ConfigurationManager.AppSettings["SendMailName"].ToString(),   ConfigurationManager.AppSettings["SendMailPwd"].ToString(),   MsgTitle,   MsgArtinfo,   "");
                return   b;
        }
        #endregion

解决方案 »

  1.   

    已经解决到这个程度了,只能发出去10条数据,但是数据库中的数据有几十万条
    public Queue _inQueue = new Queue();
        private const int amountThread = 10;//线程总量
        protected void Page_Load(object sender, EventArgs e)
        {
            #region 将客户邮件读取出来放入队列
            SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["AppSettingConnString"].ToString());
            conn.Open();
            string sql;
            sql = "select * from useremai_info ";
            SqlCommand cmd = new SqlCommand(sql, conn);
            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                _inQueue.Enqueue(dr[1].ToString());
            }
            Response.Write(_inQueue.Count.ToString());
            conn.Close();
            #endregion
            #region 开启指定线程发送邮件
            for (int i = 0; i < amountThread; i++)
            {
                // 创建指定数量的线程
                // 是线程调用Run方法
                // 启动线程
                Thread trd = new Thread(new ThreadStart(BatSendMail));
                trd.Name = "线程" + i;
                trd.Start();
            }
            #endregion    }
            #region 批量发送邮件(加锁)
            private void BatSendMail()
            {
                lock(this)
                {
                SendMail(_inQueue.Peek().ToString(), Thread.CurrentThread.Name + "A多线程测试" + DateTime.Now.ToString(), "邮件内容");
                _inQueue.Dequeue();
                }
            }
            #endregion
            #region 发邮件
            /// <summary>
            /// 发送Email营销邮件
            /// </summary>
            /// <param name="EmailAddress">收件人邮箱</param>
            /// <param name="MsgTitle">邮件标题</param>
            /// <param name="MsgArtinfo">邮件内容</param>
            /// <returns>成功返回"true"失败返回"false"</returns>
            private string SendMail(string EmailAddress, string MsgTitle, string MsgArtinfo)
            {
                string b = "";
                Bj5288SendEmail _Bj5288SendEmail = new Bj5288SendEmail();
                b = _Bj5288SendEmail.SendMail5288(EmailAddress, ConfigurationManager.AppSettings["SendMailName"].ToString(), ConfigurationManager.AppSettings["SendMailPwd"].ToString(), MsgTitle, MsgArtinfo, "");
                return b;
            }
            #endregion
      

  2.   

    private   void   BatSendMail() 
                    { 
                            lock(this) 
                            { 
                       while(_inqueue.count>0)
                           {
                            SendMail(_inQueue.Peek().ToString(),   Thread.CurrentThread.Name   +   "A多线程测试"   +   DateTime.Now.ToString(),   "邮件内容"); 
                            _inQueue.Dequeue(); 
                            } 
                              }                    } 
      

  3.   

    为什么先peek而不直接dequeue呢??