gpt4 book ai didi

c# - 发送电子邮件异步 : An asynchronous module or handler completed while an asynchronous operation was still pending

转载 作者:太空宇宙 更新时间:2023-11-03 18:23:02 33 4
gpt4 key购买 nike

我正在尝试从 Controller 异步发送电子邮件并收到以下错误:

不想等待电子邮件发送完成操作。

An asynchronous module or handler completed while an asynchronous operation was still pending.

这是我的实现:我也尝试使用 void 而不是 async Task

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
var user = await _userManager.FindByNameAsync(model.Email);
if (user != null)
{
if (!await _userManager.IsEmailConfirmedAsync(user.Id))
{

//dont want to await result
//just send email
_mailService.SendAccountConfirmationEmailAsync(user);
...
}
...
}
return View();
}

.

public async Task SendAccountConfirmationEmailAsync(ApplicationUser user)
{
dynamic email = GetAccountConfirmationEmailTemplate();

email.Username = user.Email;
email.Name = user.UserName;
email.To = user.Email;
email.AccountConfirmationUrl = await GetAccountConfirmationUrl(user);

await _mailService.SendAsync(email);
}

我错过了什么?

最佳答案

由于运行时在知道没有更多未决请求时可以回收您的应用程序域,因此特别不建议启动您不等待的任务,因此出现该消息。

特别是,如果没有这个检查,您将无法保证这封电子邮件会被发送,因为在您的 Controller 操作返回后,整个应用程序域可能会围绕该任务被拉下。

现在在您的情况下,您可能会说丢失电子邮件是可以接受的,但运行时不知道它只是一封电子邮件,这很可能是您的数据库调用我忘记等待会过早中止。因此它只是告诉您这是错误的形式。

相反,您有两个选择:

  1. 等待您明确表示不想做的任务完成
  2. 通知运行时您正在启动一个您特别不想等待的任务,但是拜托哦拜托,不要在任务完成之前拉出 appdomain<

这最后一部分是什么HostingEnvironment.QueueBackgroundWorkItem是为了。

在您的情况下,您可以这样调用它:

HostingEnvironment.QueueBackgroundWorkItem(ct =>
_mailService.SendAccountConfirmationEmailAsync(user));

此外,该方法提供了一个CancellationToken,您应该检查是否有接受它的SendAccountConfirmationEmailAsync 的重载。如果不是,并且这是您的 API,您应该考虑添加对此类 token 的支持。

请注意,此机制不适用于长时间运行的线程或任务,因为还有其他更合适的树可以树皮,但在这种情况下应该足够了。

关于c# - 发送电子邮件异步 : An asynchronous module or handler completed while an asynchronous operation was still pending,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44422556/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com