首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我们不等待异步方法时会发生什么?

问当我们不等待异步方法时会发生什么?
EN

Stack Overflow用户
提问于 2018-07-20 00:23:08
回答 1查看 5.4K关注 0票数 5

我有一个.NET核心2后端。在我的一个控制器端点中,我创建了通过电子邮件发送出去的邀请。这似乎是端点上的一个巨大瓶颈,考虑过之后,我并不需要等待这些邀请。如果这封邮件发不出去,我无论如何也做不了什么。

如果我不做await sendFn(),它本质上会是一种火和遗忘的方法吗?我在另一个堆栈溢出线程上读到,我必须执行sendFn().ContinueWith(t => throw(t))才能捕获异常,因为它将位于另一个线程中。

我在代码库中有类似的邮件功能。他们每个人做的事情略有不同,但是否有服务fn,我可以做包装,以使他们点燃和忘记?我认为有些地方我不能使用await (如果这样做有效的话),但是有些事情会改变数据库上下文,所以如果我不等待它们,我可能会遇到这样一种情况,即某些东西正在访问相同的db上下文。

代码语言:javascript
复制
[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上下文或下一次迭代发生冲突。

EN

回答 1

Stack Overflow用户

发布于 2018-07-20 07:58:50

简单的回答是,您无法保证代码的执行将完成。

这就是为什么ASP.NET核心有用于后台工作的基础设施:在.NET Core2.x and应用程序或微服务中使用IHostedService和BackgroundService类实现后台任务

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51433475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档