我有一个.NET核心2后端。在我的一个控制器端点中,我创建了通过电子邮件发送出去的邀请。这似乎是端点上的一个巨大瓶颈,考虑过之后,我并不需要等待这些邀请。如果这封邮件发不出去,我无论如何也做不了什么。
如果我不做await sendFn(),它本质上会是一种火和遗忘的方法吗?我在另一个堆栈溢出线程上读到,我必须执行sendFn().ContinueWith(t => throw(t))才能捕获异常,因为它将位于另一个线程中。
我在代码库中有类似的邮件功能。他们每个人做的事情略有不同,但是否有服务fn,我可以做包装,以使他们点燃和忘记?我认为有些地方我不能使用await (如果这样做有效的话),但是有些事情会改变数据库上下文,所以如果我不等待它们,我可能会遇到这样一种情况,即某些东西正在访问相同的db上下文。
[HttpPost]
public async Task<IActionResult> CreateEvent([FromBody] Event val)
{
_ctx.Event.Add(val);
await _ctx.SaveChangesAsync();
await SendInvitations(val); // fn in question
return Ok();
}
public async Task SendInvitation(Event event)
{
forEach (var person in event.people)
{
await _ctx.Invitation.Add(person); // This shouldn't happen while another iteration or some other async code elsewhere is using the db ctx.
_ctx.SaveChangesAsync();
await _mailService.SendMail(person.email,"you have been invited"); // don't really need to await this.
}
}我把有关事件的数据发到服务器上。创建事件并将其保存到数据库后,我将为每个人创建邀请。这些邀请也是数据库项目。然后我发一封电子邮件。我最担心的是,如果我放弃等待,那么当我创建邀请时,它可能会与其他地方的db上下文或下一次迭代发生冲突。
发布于 2018-07-20 07:58:50
简单的回答是,您无法保证代码的执行将完成。
这就是为什么ASP.NET核心有用于后台工作的基础设施:在.NET Core2.x and应用程序或微服务中使用IHostedService和BackgroundService类实现后台任务
https://stackoverflow.com/questions/51433475
复制相似问题