要实现,用多线程群发邮件,我一下的程序效果是向所有的邮件地址重复发送了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
我的需求是用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
解决方案 »
- 讨论在Web开发当中我的后台删除文件他会说该文件正在被另外一个进程使用于是我修改了名称结果成功讨论
- 服务器端XML文件设置权限
- 本人菜鸟。。请教个问题!
- 请教高手:如何根据IP和端口号识别是攻击还是正常WEB访问?
- 关于ACCESS和SQL SERVER 2000在后台代码中添加记录区别的问题
- asp.net的两个小问题,求各位帮忙,谢谢!
- 弹出窗口,帮我一下
- 到底是怎么回事呀??????我这3年在csdn上的问题怎么一下子给我删了!!!!!!!!!!!!!!!!!!!!!!111
- 如何在Asp.net中使用Microsoft Enterprise Library
- 无法转换类型
- 菜鸟提问
- 请教一个比较特别的分页问题:不刷新页面的分页
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
{
lock(this)
{
while(_inqueue.count>0)
{
SendMail(_inQueue.Peek().ToString(), Thread.CurrentThread.Name + "A多线程测试" + DateTime.Now.ToString(), "邮件内容");
_inQueue.Dequeue();
}
} }