请教一个关于多线程的问题

williamwang8187 2008-07-07 11:01:03
现在我在一个Windows小程序中要实现若干个功能包括从数据库中导出Excel报表,发送邮件等,用到了多线程,现在我有个问题
我在发送邮件时,点击Button时开启了一个线程,请教高手怎么解决??????????????
private void btnSendEmail_Click(object sender, EventArgs e)
{
ThreadStart tsEmail = new ThreadStart(SendMail);
Thread thread = new Thread(tsEmail);
thread.Start();

}
调用了SendMail()发送邮件的方法,但我在测试用错误的格式输入邮箱名称时,程序提示仍是发送成功,我在检查时发现第一个邮箱确实发送成功了,但后面的邮箱确并没有成功。(我在处理群发邮件时是在文本框中输入多个邮箱地址按“;”号分割的,但我按“,”等非法输入时程序也提示成功 ,当我在关掉程序时,这个线程始终任务管理器重运行,怎么样销毁这个线程,而且我在走单步时,程序进入不了SendMail()方法,直接运行结果。
/// <summary>
/// 发送邮件的方法
/// </summary>
public void SendMail()
{
try
{
FileInfo file = new FileInfo(filename);
if (file.Exists)
{
if (txtEmail1.Text.Trim() != "")
{
textBox1.Text += "邮件发送中。。。。。。" + "\r\n";
MailAddress from = new MailAddress("jpcx@p-pass.com");

string [] strEmailTo= txtEmail1.Text.Trim().Split(';');

foreach (string emailto in strEmailTo)
{
MailMessage aMessage = new MailMessage();
MailAddress to = new MailAddress(emailto);

aMessage.From = from;
aMessage.To.Add(to);
aMessage.Subject = "今日报表传输成功,请查阅!";
Attachment data = new Attachment(filename, MediaTypeNames.Application.Octet);


aMessage.Attachments.Add(data);

SmtpClient client = new SmtpClient("mail.p-pass.com", 25);

System.Net.NetworkCredential login = new System.Net.NetworkCredential("jpcx", "2008jp123456");

client.Credentials = login;
client.Timeout = 600000;
client.Send(aMessage);
data.Dispose();
}

MessageBox.Show("邮件发送成功!");
textBox1.Text += "邮件发送成功!" + "\r\n";
}
else
{
MessageBox.Show("请输入您要发送的目标邮箱!");
}
}
else
{
MessageBox.Show("该附件不存在,请检查!");
}
}
catch (Exception ex)
{
textBox1.Text += "发送邮件失败" + "\r\n";
MessageBox.Show(ex.Message.ToString());

}
}
...全文
217 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
barius 2008-07-09
  • 打赏
  • 举报
回复
把你那个发送邮件的Thread的IsBackground属性设置成True,然后再Start,这样主线程结束之后就可以正常退出了- -~
marvelstack 2008-07-08
  • 打赏
  • 举报
回复
建议你使用BackgroundWorker类来处理,会省事很多。
zzyhuian06142 2008-07-07
  • 打赏
  • 举报
回复
public bool _allSeccess =true;public void SendMail()
{
try
{
FileInfo file = new FileInfo(filename);
if (file.Exists)
{
if (txtEmail1.Text.Trim() != "")
{
textBox1.Text += "邮件发送中。。。。。。" + "\r\n";
MailAddress from = new MailAddress("jpcx@p-pass.com");

string [] strEmailTo= txtEmail1.Text.Trim().Split(';');

foreach (string emailto in strEmailTo)
{
//加个判断(if emailto.split('@').lenth <=2)
{

MailMessage aMessage = new MailMessage();
MailAddress to = new MailAddress(emailto);

aMessage.From = from;
aMessage.To.Add(to);
aMessage.Subject = "今日报表传输成功,请查阅!";
Attachment data = new Attachment(filename, MediaTypeNames.Application.Octet);


aMessage.Attachments.Add(data);

SmtpClient client = new SmtpClient("mail.p-pass.com", 25);

System.Net.NetworkCredential login = new System.Net.NetworkCredential("jpcx", "2008jp123456");

client.Credentials = login;
client.Timeout = 600000;
client.Send(aMessage);
data.Dispose();
}
else
{
allSeccess =false;
}

}
if(allSeccess )
{

MessageBox.Show("邮件发送成功!");
textBox1.Text += "邮件发送成功!" + "\r\n";
}
else
{
MessageBox.Show("邮件未全部发送成功!");
textBox1.Text += "邮件未全部发送成功!" + "\r\n";
}

}
else
{
MessageBox.Show("请输入您要发送的目标邮箱!");
}
}
else
{
MessageBox.Show("该附件不存在,请检查!");
}
}
catch (Exception ex)
{
textBox1.Text += "发送邮件失败" + "\r\n";
MessageBox.Show(ex.Message.ToString());

}
}
dayou123123 2008-07-07
  • 打赏
  • 举报
回复
这不明摆着吗
MessageBox.Show("邮件发送成功!");
textBox1.Text += "邮件发送成功!" + "\r\n";
你放在if 括号内只要txtEmail1.Text.Trim() != "" 满足,上边那句话总能显示
zzyhuian06142 2008-07-07
  • 打赏
  • 举报
回复
把thread 定义成public的
然后在SendMail后加finally
thread = null;
aimeast 2008-07-07
  • 打赏
  • 举报
回复
这么复杂?
newrockmans 2008-07-07
  • 打赏
  • 举报
回复
你这句textBox1.Text += "邮件发送成功!" + "\r\n"; 有问题,只要满足一次就永远显示成功。还有thread 你没有释放资源。

110,922

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧