选择不在 ASP.NET Core WebAPI 控制器中等待异步函数运行

sol*_*897 4 c# asynchronous async-await asp.net-web-api

场景如下:

  • 后端:Asp.NET Core WebAPI 2.2
  • 前端:使用 API 的 iOS 和 Android

我有一个功能,允许用户向其他用户发送消息。消息的发送是在异步操作中完成的:

public async Task<IActionResult> CreateMessage

此操作按顺序执行以下操作:

  1. 验证
  2. 等待消息持久化到 DB
  3. 通过 SignalR 等待相关客户端的通知
  4. 不等待通过 Azure 通知中心发送推送通知。
  5. 返回 200 OK。

动作的最后两行如下:

_notificationHubProxy.SendNotification(messageToReturnResource.SenderName, messageToPush, recipientId);

return Ok(messageToReturnResource);
Run Code Online (Sandbox Code Playgroud)

SendNotification 是异步的,但我选择不等待它以避免因等待请求完成而导致 UI 锁定。目前这一切似乎都运行良好。

我的问题实际上如下:这是 oky(即不等待),还是这是一个编写错误代码的示例,当我有很多客户端使用该应用程序时会导致问题?

问候

Ste*_*ary 8

ASP.NET(核心和经典)上的即发即忘存在一些问题:

  • 任何异常都将被静默忽略。
  • 应用程序无法检测到操作何时完成。这意味着所有比此代码“更高”的东西都不知道您的代码仍在做某事;ASP.NET、IIS 和您的负载平衡器不知道您的应用程序仍在进行中。其中一些是可以(并且将会)关闭您的应用程序的管理系统。例如,IIS 执行常规的 AppPool 回收。

ASP.NET 上的 Fire and Forget 用例比大多数人想象的要少得多。您不仅必须对默默地吞下错误感到满意,而且还必须对偶尔丢失该工作的情况感到满意。

我选择不等待它以避免因等待请求完成而导致 UI 锁定。

这听起来像是应该由 UI 解决方案解决的 UI 问题。

  • 你是对的。这是一个 UI 问题,我现在已经实现了一个很棒的 UI 解决方案。我已经把它改回来了,这样我就可以等待推送的发送了。 (2认同)