CSDN-CSDN社区-.NET技术-C#

收藏 请教一个关于多线程的问题[问题点数:30]

楼主发表于: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());

            }
        }
回复次数:7
#1楼 得分:0回复于:2008-07-07 11:14:32
这么复杂?
#2楼 得分:0回复于:2008-07-07 11:20:21
把thread 定义成public的
然后在SendMail后加finally
thread = null;
  • dayou123123用户头像
  • dayou123123
  • (快乐难免就要俗一点)
  • 等 级:
#3楼 得分:0回复于:2008-07-07 11:28:51
这不明摆着吗
MessageBox.Show("邮件发送成功!");
textBox1.Text += "邮件发送成功!" + "\r\n";
你放在if 括号内只要txtEmail1.Text.Trim() != "" 满足,上边那句话总能显示
#4楼 得分:0回复于:2008-07-07 11:48:33
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());

            }
        }
#5楼 得分:0回复于:2008-07-07 14:20:48
你这句textBox1.Text += "邮件发送成功!" + "\r\n"; 有问题,只要满足一次就永远显示成功。还有thread 你没有释放资源。
  • zhzuo用户头像
  • zhzuo
  • (秋枫)
  • 等 级:
#6楼 得分:0回复于:2008-07-08 20:49:17
建议你使用BackgroundWorker类来处理,会省事很多。
  • barius用户头像
  • barius
  • (Barius)
  • 等 级:
#7楼 得分:0回复于:2008-07-09 08:28:10
把你那个发送邮件的Thread的IsBackground属性设置成True,然后再Start,这样主线程结束之后就可以正常退出了- -~
相关问题
请教一个多线程管理的问题
请教:一个多线程实现图象序列动画问题?(up有分!!!) VC/MFC ...
请教一个在多线程下的数据处理问题? VC/MFC / 进程/线程/DLL - CSDN ...
请教一个多线程问题。 Delphi / VCL组件开发及应用- CSDN社区community ...
大家好,请教一个多线程数据库访问的问题Java / Web 开发- CSDN社区 ...
请教一个多线程的问题Delphi / VCL组件开发及应用- CSDN社区community ...