选择不等待核心 WebAPI 控制器中运行的异步函数 ASP.NET

方案如下:

  • 后端:Asp.NET 核心 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);

SendNotification是异步的,但我选择不等待它,以避免由于请求完成而导致UI锁定。目前,所有这些似乎都很好。

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

问候


茅侃侃
浏览 87回答 1
1回答

慕森王

ASP.NET(核心和经典)上的“即发即弃”存在一些问题:任何异常都将被静默忽略。应用程序无法检测到操作何时完成。这意味着所有“高于”此代码的东西都不知道您的代码仍在执行某些操作;ASP.NET、IIS 和负载均衡器都不知道您的应用程序仍在进行中。其中一些是可以(并且将)关闭你的应用的管理系统。例如,IIS执行定期的应用程序池回收。Fire and Forget on ASP.NET 的用例比大多数人想象的要罕见得多。你不仅要对默默吞咽错误感到满意,而且你还必须对偶尔失去这项工作感到满意。我选择不等待它,以避免由于等待请求完成而导致的UI锁定。这听起来像是一个应该由UI解决方案解决的UI问题。
打开App,查看更多内容
随时随地看视频慕课网APP