在工作时阻止程序进入忙碌模式

时间:2011-07-30 08:38:36

标签: c# multithreading

我正在制作一个程序,一次发送许多电子邮件,我注意到程序正在运行时,它继续忙碌模式即:我无法编辑任何东西或触摸任何东西,我做了一个函数来显示成功发送的数量标签上的电子邮件和失败的电子邮件,以便用户可以监控已发送的电子邮件,现在我遇到问题,标签显示程序完成发送电子邮件后的整数,我想阻止它,我尝试使用线程模式但失败了。这是代码:

int success = 0;

    private void success()
    {
        label17.Text = success.ToString();
    }

    private void sendmail()
    {
        SmtpClient client = new SmtpClient(comboBox1.Text);
        client.Credentials = new NetworkCredential(textBox6.Text, textBox7.Text);
        MailMessage message = new MailMessage();
        message.From = new MailAddress(textBox3.Text, textBox1.Text);
        message.Subject = textBox4.Text;
        message.Body = richTextBox1.Text;
        if (textBox5.Text != "")
        {
            message.Attachments.Add(new Attachment(textBox5.Text));
        }

        string bulkpath = textBox2.Text;

        foreach(string eachmail in File.ReadAllLines(bulkpath))
        {
            Thread t = new Thread(success);          // Kick off a new thread
            t.Start();  

            message.To.Add(eachmail);
            try
            {
                client.Send(message);
                success++;
            }
            catch
            {
                MessageBox.Show("One has not passed :(");
            }
            message.To.Clear();
        }

    }

3 个答案:

答案 0 :(得分:2)

使用BackgroudWorker启动新主题并将sendmail()完全放入另一个主题中。使用ReportProgress方法向主线程通知已完成的百分比,在您的情况下发送的邮件数量。

问候。

答案 1 :(得分:2)

您可以选择只启动一个负责发送邮件的新线程

Thread t = new Thread(new ThreadStart(sendMail));
t.Start();

使用BackgroundWorker时,您可以实现进度通知,并且当您的操作在后台完成时,您就可以收到回调。

和Thorsten

答案 2 :(得分:0)

其他人提供的解决方案完全有效,但需要对ThreadBackgroundWorker进行一些控制,我建议您使用异步发送方法。

试试这个:

    void Send()
    {
        SmtpClient client = new SmtpClient();
        client.SendCompleted += new SendCompletedEventHandler(client_SendCompleted);
        client.SendAsync(/* METHOD's PARAMS */);
    }

    void client_SendCompleted(object sender, AsyncCompletedEventArgs e)
    {
        if (e.Error != null || e.Cancelled)
        {
            // TODO : Report error
        }
    }
希望这有帮助。