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();是我的报告生成方法,解决了这个问题。