我有一个winforms应用程序,用户可以从中发送电子邮件。这封电子邮件是异步发送的,而不是等待(火与忘记)
调用电子邮件async的方法实例化一个类(EmailSender),它完成编写电子邮件,发送电子邮件并将结果记录在数据库中的所有工作。我希望在一个using语句中包装EmailSender会导致资源仍然在异步尝试完成时出现问题。但是,如果我只是实例化该类并调用EmailSender.Send(),则资源将无法正确处理。
在正确管理资源的同时,最好的方法是什么。我最好将所有这些投入到管理自己资源的静态方法中,还是我完全误解了这里的问题
//Fire and forget
EmailSender es = new EmailSender(itemId);
es.Send();
public class EmailSender
{
public EmailSender(int ItemId)
{
//initialise stuff
}
public async void SendAsync()
{
string emailContent = getEmailContent();
using (MailMessage mail = new MailMessage())
{
using (SmtpClient client = emailManager.getSMTPSettings())
{
try
{
string fromSender = emailManager.getEmailFrom();
if (!string.IsNullOrEmpty(fromSender)) mail.From = new MailAddress(fromSender);
//etc
await client.SendMailAsync(mail);
}
catch
{ //log to db}
}
}
}
}
private string getEmailContent()
{
return "content";
}
}
编辑: 我希望在窗体关闭后,异步代码在后台继续,用户将移动到应用程序的不同部分。
答案 0 :(得分:-1)
如果异步方法返回SendAsync().Wait();
,您可以将其称为table