Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式发送邮件而不冻结用户界面_C#_Winforms - Fatal编程技术网

C# 如何以编程方式发送邮件而不冻结用户界面

C# 如何以编程方式发送邮件而不冻结用户界面,c#,winforms,C#,Winforms,我有一个通过接收短信发送电子邮件的应用程序。我在这一点上实现了代码smt.Send(mailMsg)我的UI会冻结,直到发送过程完成,这有时需要2-5分钟,我不希望用户认为应用程序已崩溃或出现故障。因此,我想知道如何在backgroundworker中运行该方法,以避免冻结我的UI。下面是相关代码,谢谢 报表生成/导出方法 private void Q4report() { Control.CheckForIllegalCrossThreadCalls = false;

我有一个通过接收短信发送电子邮件的应用程序。我在这一点上实现了代码
smt.Send(mailMsg)我的UI会冻结,直到发送过程完成,这有时需要2-5分钟,我不希望用户认为应用程序已崩溃或出现故障。因此,我想知道如何在backgroundworker中运行该方法,以避免冻结我的UI。下面是相关代码,谢谢

报表生成/导出方法

 private void Q4report()
    {
        Control.CheckForIllegalCrossThreadCalls = false;
        Output("Processing request...");
        ReportDocument cryRpt1 = new ReportDocument();
        cryRpt1.Load("cryQ2.rpt");
        crystalReportViewer2.ReportSource = cryRpt1;
        crystalReportViewer2.Refresh();
        cryRpt1.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, "QueryReport.pdf");
        Output("Generating report...");
        Output("Report Process Completed");
        if (i != 1)
        {
            sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report");
        }
        else if( i == 1)
        {
            Unsent_Request_sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report");
        }


    }
    public bool sendMail(string pdf, string subject)
    {
        bool flag = false;
        MailMessage mailMsg = new MailMessage();
        try
        {

            // To

            mailMsg.From = new MailAddress(radtxtEmail.Text);
            if (sub3 != null)
            {
                string strSubject = subject;
                string strBody = "Kindly find attached your query report.";

                mailMsg.To.Add(sub3);
                mailMsg.Subject = strSubject;
                mailMsg.Body = strBody;

                Attachment attachment = new Attachment(pdf);
                mailMsg.Attachments.Add(attachment);
                mailMsg.IsBodyHtml = true;

                using (SmtpClient smt = new SmtpClient("smtp.gmail.com"))
                {
                    smt.Port = 587;
                    smt.Credentials = new System.Net.NetworkCredential(radtxtEmail.Text, radtxtboxPassword.Text);
                    smt.EnableSsl = true;

                    bool connection = NetworkInterface.GetIsNetworkAvailable();

                    bool IsOnline = ModemManager.netCheck.IsOnline();

                    if (connection == true)
                    {
                        if (IsOnline == true)
                        {

                            smt.Send(mailMsg);
                            sent_insert();

                            mailMsg.Dispose();
                            attachment.Dispose();
                            Output("Report Mail successfully sent!");
                        }
                        else
                        {

                            Output("Internet Access Unavailable.");
                            Output("Mail process terminated.");
                            Unsent_insert();
                            mailMsg.Dispose();
                            attachment.Dispose();
                        //    btnSendMessage_Click();
                            return false;
                        }
                    }
                    else
                    {

                        Output("Network Connectivity Unavailable.");

                        Unsent_insert();

                        mailMsg.Dispose();
                        attachment.Dispose();
                  //      btnSendMessage_Click();
                        return false;
                    }

                }

                flag = true;


            }
        }

        catch (Exception ex)
        {

          Output(ex.Message);

        }


        return flag;

    }
电子邮件发送方式

 private void Q4report()
    {
        Control.CheckForIllegalCrossThreadCalls = false;
        Output("Processing request...");
        ReportDocument cryRpt1 = new ReportDocument();
        cryRpt1.Load("cryQ2.rpt");
        crystalReportViewer2.ReportSource = cryRpt1;
        crystalReportViewer2.Refresh();
        cryRpt1.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, "QueryReport.pdf");
        Output("Generating report...");
        Output("Report Process Completed");
        if (i != 1)
        {
            sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report");
        }
        else if( i == 1)
        {
            Unsent_Request_sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report");
        }


    }
    public bool sendMail(string pdf, string subject)
    {
        bool flag = false;
        MailMessage mailMsg = new MailMessage();
        try
        {

            // To

            mailMsg.From = new MailAddress(radtxtEmail.Text);
            if (sub3 != null)
            {
                string strSubject = subject;
                string strBody = "Kindly find attached your query report.";

                mailMsg.To.Add(sub3);
                mailMsg.Subject = strSubject;
                mailMsg.Body = strBody;

                Attachment attachment = new Attachment(pdf);
                mailMsg.Attachments.Add(attachment);
                mailMsg.IsBodyHtml = true;

                using (SmtpClient smt = new SmtpClient("smtp.gmail.com"))
                {
                    smt.Port = 587;
                    smt.Credentials = new System.Net.NetworkCredential(radtxtEmail.Text, radtxtboxPassword.Text);
                    smt.EnableSsl = true;

                    bool connection = NetworkInterface.GetIsNetworkAvailable();

                    bool IsOnline = ModemManager.netCheck.IsOnline();

                    if (connection == true)
                    {
                        if (IsOnline == true)
                        {

                            smt.Send(mailMsg);
                            sent_insert();

                            mailMsg.Dispose();
                            attachment.Dispose();
                            Output("Report Mail successfully sent!");
                        }
                        else
                        {

                            Output("Internet Access Unavailable.");
                            Output("Mail process terminated.");
                            Unsent_insert();
                            mailMsg.Dispose();
                            attachment.Dispose();
                        //    btnSendMessage_Click();
                            return false;
                        }
                    }
                    else
                    {

                        Output("Network Connectivity Unavailable.");

                        Unsent_insert();

                        mailMsg.Dispose();
                        attachment.Dispose();
                  //      btnSendMessage_Click();
                        return false;
                    }

                }

                flag = true;


            }
        }

        catch (Exception ex)
        {

          Output(ex.Message);

        }


        return flag;

    }

使用BackgroundWorker防止冻结

使用BackgroundWorker防止冻结

使用BackgroundWorker防止冻结

使用BackgroundWorker防止冻结

您可以将sendMail方法封装在任务中。运行block将在单独的线程上启动该方法:

if (i != 1)
{
    Task.Run(() => sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report"));
}
请注意,除非保存创建的任务,否则无法监视任务的完成状态,或者在需要时取消任务。如果这是针对UI,我会将创建的任务捕获为父类状态的一部分:

private Task sendMailTask;
然后附加从任务创建的任务。运行,以便在需要时能够返回到生成的任务:

 if (i != 1)
{
    this.sendMailTask = Task.Run(() => sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report"));
}
或者,如果这是由于按钮单击而触发的,例如,您可以在异步void方法中等待它:

private async void button2_Click(object sender, EventArgs e)
{
    // ...
    if (i != 1)
    {
        await Task.Run(() => sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report"));
    }
    // ...
}

它仍然会将控制权返回到UI,并在后台运行发送邮件的工作。

您可以将sendMail方法封装在任务中。运行块将在单独的线程上启动该方法:

if (i != 1)
{
    Task.Run(() => sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report"));
}
请注意,除非保存创建的任务,否则无法监视任务的完成状态,或者在需要时取消任务。如果这是针对UI,我会将创建的任务捕获为父类状态的一部分:

private Task sendMailTask;
然后附加从任务创建的任务。运行,以便在需要时能够返回到生成的任务:

 if (i != 1)
{
    this.sendMailTask = Task.Run(() => sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report"));
}
或者,如果这是由于按钮单击而触发的,例如,您可以在异步void方法中等待它:

private async void button2_Click(object sender, EventArgs e)
{
    // ...
    if (i != 1)
    {
        await Task.Run(() => sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report"));
    }
    // ...
}

它仍然会将控制权返回到UI,并在后台运行发送邮件的工作。

您可以将sendMail方法封装在任务中。运行块将在单独的线程上启动该方法:

if (i != 1)
{
    Task.Run(() => sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report"));
}
请注意,除非保存创建的任务,否则无法监视任务的完成状态,或者在需要时取消任务。如果这是针对UI,我会将创建的任务捕获为父类状态的一部分:

private Task sendMailTask;
然后附加从任务创建的任务。运行,以便在需要时能够返回到生成的任务:

 if (i != 1)
{
    this.sendMailTask = Task.Run(() => sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report"));
}
或者,如果这是由于按钮单击而触发的,例如,您可以在异步void方法中等待它:

private async void button2_Click(object sender, EventArgs e)
{
    // ...
    if (i != 1)
    {
        await Task.Run(() => sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report"));
    }
    // ...
}

它仍然会将控制权返回到UI,并在后台运行发送邮件的工作。

您可以将sendMail方法封装在任务中。运行块将在单独的线程上启动该方法:

if (i != 1)
{
    Task.Run(() => sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report"));
}
请注意,除非保存创建的任务,否则无法监视任务的完成状态,或者在需要时取消任务。如果这是针对UI,我会将创建的任务捕获为父类状态的一部分:

private Task sendMailTask;
然后附加从任务创建的任务。运行,以便在需要时能够返回到生成的任务:

 if (i != 1)
{
    this.sendMailTask = Task.Run(() => sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report"));
}
或者,如果这是由于按钮单击而触发的,例如,您可以在异步void方法中等待它:

private async void button2_Click(object sender, EventArgs e)
{
    // ...
    if (i != 1)
    {
        await Task.Run(() => sendMail("QueryReport.pdf", "4POS StockItem/per price list Query Report"));
    }
    // ...
}

它仍然会将控制权返回到UI,并在后台运行发送邮件的工作。

我想我必须在后台运行电子邮件发送过程,并调用backgroundWorker1.RunWorkerAsync();是我的报告生成方法,解决了这个问题。我想我必须以后台工作人员的身份运行电子邮件发送过程,并调用backgroundWorker1.RunWorkerAsync();是我的报告生成方法,解决了这个问题。我想我必须以后台工作人员的身份运行电子邮件发送过程,并调用backgroundWorker1.RunWorkerAsync();是我的报告生成方法,解决了这个问题。我想我必须以后台工作人员的身份运行电子邮件发送过程,并调用backgroundWorker1.RunWorkerAsync();是我的报告生成方法,解决了这个问题。