C# 在不等待的情况下调用异步方法-潜在的已处理对象问题

C# 在不等待的情况下调用异步方法-潜在的已处理对象问题,c#,asynchronous,C#,Asynchronous,我有一个winforms应用程序,用户可以从中发送电子邮件。此电子邮件是异步发送的,不等待发送 调用email async的方法实例化了一个类EmailSender,该类完成编写电子邮件、发送电子邮件和将结果记录到数据库中的所有工作。我预计,在using语句中包装EmailSender将导致资源仍在异步工作并试图完成时出现问题。但是,如果我只是实例化该类并调用EmailSender.Send,资源将不会得到正确的处理 在正确管理资源的同时,最好的方法是什么。我是不是最好把这些都投入到管理自己资源

我有一个winforms应用程序,用户可以从中发送电子邮件。此电子邮件是异步发送的,不等待发送

调用email 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";
    }
}
编辑:
我希望在表单关闭后,异步代码在后台继续运行,用户可以切换到应用程序的不同部分。

如果异步方法返回任务,您可以像SendAsync.Wait一样调用它

如果async方法返回Task,您可以像SendAsync.Wait一样调用它

不等待SendAsync的原因是什么?如果您安装的类的实例仍处于活动状态,您的资源将不会自动丢弃。使用dispose界面手动释放您的资源。我已编辑以澄清-我希望关闭表单后代码继续。基本上用户填写信息,然后提交表单。这将在后台独立触发电子邮件。您使用的是什么框架?Asp.net?Wpf?如果您可以按照自己的意愿将EmailSender设置为IDisposable并调用es.SendAsync.ContinueWithtask=>es.Dispose,该怎么办?只需确保不使用as usingvar sender=new EmailSender…,只需执行常规var sender=new EmailSender。。。并在任务完成后处理此对象不等待SendAsync的原因是什么?如果您安装的类的实例仍处于活动状态,则不会自动丢弃您的资源。使用dispose界面手动释放您的资源。我已编辑以澄清-我希望关闭表单后代码继续。基本上用户填写信息,然后提交表单。这将在后台独立触发电子邮件。您使用的是什么框架?Asp.net?Wpf?如果您可以按照自己的意愿将EmailSender设置为IDisposable并调用es.SendAsync.ContinueWithtask=>es.Dispose,该怎么办?只需确保不使用as usingvar sender=new EmailSender…,只需执行常规var sender=new EmailSender。。。并在任务完成后处理此对象这与根本不创建任务并同步执行工作相同。这与根本不创建任务并同步执行工作相同。