在非异步方法C#中调用async void方法

本文关键字:async void 方法 调用 异步方法 | 更新日期: 2023-09-27 17:57:44

我在非异步方法中调用async void函数时遇到问题。我得到内部服务器错误。我在谷歌上搜索了这个问题,找到了一些TASK和非TASK的答案。我的案子不是任务,所以我应该叫任务。运行Synchronously()。它将等待我的异步方法完成,然后继续到下一点。但当我调试时,它会带来服务器错误。

private async void MyMthodAsync(int userId, string email)
{
    var emailTemplate = await EmailTemplateLoader.Load(EmailTemplateFile);
    var Message = new MailMessage(emailTemplate.`enter code here`From, email)
    {
        Subject = emailTemplate.Subject,
        Body = emailTemplate.Body,
        IsBodyHtml = true,
        BodyEncoding = Encoding.UTF8
    };
    await EmailSender.Send(Message);
}

我在无异步方法中调用上面的异步方法

public HttpResponseMessage ChangePassword([FromBody]ChangePasswordModel model)
{
    Task sendEmail = new Task(()=>MyMthodAsync(model.userId, model.email));
    sendEmail.RunSynchronously();
    return TheResponse.CreateSuccessResponse(Constants.PasswordHasBeenSuccessfullyChanged);
}

我得到的响应是内部服务器错误。

我做错了什么?

在非异步方法C#中调用async void方法

避免async void,除非它是事件处理程序。将返回类型更改为Task

private async Task SendChangePasswordEmailAsync(int userId, string email)
{
    var emailTemplate = await EmailTemplateLoader.Load(EmailTemplateFile);
    var Message = new MailMessage(emailTemplate.From, email)
    {
        Subject = emailTemplate.Subject,
        Body = emailTemplate.Body,
        IsBodyHtml = true,
        BodyEncoding = Encoding.UTF8
    };
    await EmailSender.Send(Message);
}

然后将方法更改为使用async-await

public async Task<HttpResponseMessage> ChangePassword(
    [FromBody]ChangePasswordModel model
)
{
    await SendChangePasswordEmailAsync(model.userId, model.email);
    return TheResponse
        .CreateSuccessResponse(Constants.PasswordHasBeenSuccessfullyChanged);
}