繁体   English   中英

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

[英]call async void method within non-async method C#

我在非异步方法中调用异步void函数时遇到问题。 我收到内部服务器错误。 我已经用谷歌搜索了这个问题,并找到了一些有关任务而不是任务的答案。 我的情况不是任务,所以我应该调用task.RunSynchronously()。 这将等待我的异步方法完成,然后继续进行下一步。 但是,当我调试它带来服务器错误。

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);
}

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

我究竟做错了什么?

除非它是事件处理程序,否则避免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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM