我有一个.NET CORE 2后端。在我的控制器端点之一中,我正在创建通过电子邮件发送的邀请。这似乎是端点上的一个巨大瓶颈,并且经过思考,我实际上不需要等待这些邀请。如果电子邮件无法发送,我也无能为力。
如果我不执行
我在代码库中有类似的邮寄功能。它们各自做着略微不同的事情,但是否有一种服务函数可以包装它们以进行快速处理?我认为有些地方我可以不使用
如果我不执行
await sendFn()
会不会变成一种“fire and forget”的方法?我在另一个stackoverflow线程上看到,我必须执行sendFn().ContinueWith(t => throw(t))
才能捕获异常,因为它将在另一个线程中。我在代码库中有类似的邮寄功能。它们各自做着略微不同的事情,但是否有一种服务函数可以包装它们以进行快速处理?我认为有些地方我可以不使用
await
(如果可以的话),但有些东西会改变数据库上下文,所以如果我不等待它们,我可能会遇到访问相同数据库上下文的情况。[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.
}
}
我正在向服务器发布有关事件的数据。在将事件创建并保存到数据库后,我会为每个人创建邀请。这些邀请也是数据库项。然后我发送电子邮件。我最担心的是,如果我放弃等待(await),那么当我创建邀请时,它可能会与其他地方或下一次迭代的数据库上下文发生冲突。