webapi 2 - 如何正确调用 long 运行 方法 async/in 新线程,以及 return 对客户端的响应
webapi 2 - how to properly invoke long running method async/in new thread, and return response to client
我正在开发一个 web-api,它从客户端获取数据,并将其保存以备后用。现在我有一个需要了解所有事件的外部系统,所以我想在我的网络中设置一个通知组件-api.
我所做的是,在保存数据后,我在我的新组件中执行一个 SendNotification(message)
方法。与此同时,我不想让我的客户等待,甚至不知道我们正在发送通知,所以我想 return 尽快 201 Created / 200 OK
回复我的客户。
是的,这是一个即发即弃的场景。我希望通知组件处理所有异常情况(如果通知失败,api 的客户端根本不关心)。
我试过使用async/await
,但这在网络中不起作用-api,因为当请求线程终止时,异步操作也会终止。
所以我看了一下Task.Run()
。
我的控制器看起来像这样:
public IHttpActionResult PostData([FromBody] Data data) {
_dataService.saveData(data);
//This could fail, and retry strategy takes time.
Task.Run(() => _notificationHandler.SendNotification(new Message(data)));
return CreatedAtRoute<object>(...);
}
以及我的 NotificationHandler 中的方法
public void SendNotification(Message message) {
//..send stuff to a notification server somewhere, syncronously.
}
我在 C# 世界中相对较新,我不知道是否有更优雅(或更合适)的方法来执行此操作。使用这种方法有什么陷阱吗?
这真的取决于多长时间。您是否详细研究了 QueueBackgroundWorkItem 的可能性 here。如果你想实现一个非常快的火并且忘记你也可能想要考虑一个队列来弹出这些消息,这样你就可以立即从控制器 return 。然后你必须有一些东西来轮询队列并发出通知,即计划任务,Windows 服务等。IIRC,如果 IIS 在任务期间回收,进程将被终止,而 QueueBackgroundWorkItem 有一个宽限期ASP.Net 将让工作项完成它的工作。
我会看一下 Hangfire。它设置起来相当容易,它应该能够 运行 在您的 ASP.NET 进程中,并且很容易迁移到独立进程以防您的 IIS 负载突然增加。
我不久前尝试过 Hangfire,但是是在独立模式下。它有足够的文档并且易于理解 API.
我正在开发一个 web-api,它从客户端获取数据,并将其保存以备后用。现在我有一个需要了解所有事件的外部系统,所以我想在我的网络中设置一个通知组件-api.
我所做的是,在保存数据后,我在我的新组件中执行一个 SendNotification(message)
方法。与此同时,我不想让我的客户等待,甚至不知道我们正在发送通知,所以我想 return 尽快 201 Created / 200 OK
回复我的客户。
是的,这是一个即发即弃的场景。我希望通知组件处理所有异常情况(如果通知失败,api 的客户端根本不关心)。
我试过使用async/await
,但这在网络中不起作用-api,因为当请求线程终止时,异步操作也会终止。
所以我看了一下Task.Run()
。
我的控制器看起来像这样:
public IHttpActionResult PostData([FromBody] Data data) {
_dataService.saveData(data);
//This could fail, and retry strategy takes time.
Task.Run(() => _notificationHandler.SendNotification(new Message(data)));
return CreatedAtRoute<object>(...);
}
以及我的 NotificationHandler 中的方法
public void SendNotification(Message message) {
//..send stuff to a notification server somewhere, syncronously.
}
我在 C# 世界中相对较新,我不知道是否有更优雅(或更合适)的方法来执行此操作。使用这种方法有什么陷阱吗?
这真的取决于多长时间。您是否详细研究了 QueueBackgroundWorkItem 的可能性 here。如果你想实现一个非常快的火并且忘记你也可能想要考虑一个队列来弹出这些消息,这样你就可以立即从控制器 return 。然后你必须有一些东西来轮询队列并发出通知,即计划任务,Windows 服务等。IIRC,如果 IIS 在任务期间回收,进程将被终止,而 QueueBackgroundWorkItem 有一个宽限期ASP.Net 将让工作项完成它的工作。
我会看一下 Hangfire。它设置起来相当容易,它应该能够 运行 在您的 ASP.NET 进程中,并且很容易迁移到独立进程以防您的 IIS 负载突然增加。 我不久前尝试过 Hangfire,但是是在独立模式下。它有足够的文档并且易于理解 API.