在没有等待的情况下调用异步方法 - 可能导致处理对象问题

时间:2018-03-08 11:51:10

标签: c# asynchronous

我有一个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";
    }
}

编辑: 我希望在窗体关闭后,异步代码在后台继续,用户将移动到应用程序的不同部分。

1 个答案:

答案 0 :(得分:-1)

如果异步方法返回SendAsync().Wait();,您可以将其称为table