- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个 web-api,它从客户端获取数据,并将其保存以备后用。现在我有一个需要了解所有事件的外部系统,所以我想在我的 web-api 中设置一个通知组件。
我所做的是,在保存数据后,我在我的新组件中执行一个 SendNotification(message)
方法。与此同时,我不想让我的客户等待,甚至不知道我们正在发送通知,所以我想尽快向我的客户返回一个 201 Created/200 OK
响应。
是的,这是一个即发即弃的场景。我希望通知组件处理所有异常情况(如果通知失败,api 的客户端根本不关心)。
我尝试过使用 async/await
,但这在 web-api 中不起作用,因为当请求线程终止时,异步操作也会终止。
所以我看了一下 Task.Run()
。
我的 Controller 看起来像这样:
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 .如果你想实现一个非常快的触发并忘记你也可能想要考虑一个队列来弹出这些消息,这样你就可以立即从 Controller 返回。然后你必须有一些东西来轮询队列并发送通知,即计划任务、Windows 服务等。IIRC,如果 IIS 在任务期间回收,进程将被终止,而使用 QueueBackgroundWorkItem 有一个宽限期,ASP。 Net 会让工作项完成它的工作。
关于c# - webapi 2 - 如何在新线程中正确调用长时间运行的异步方法,并将响应返回给客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35477853/
我是一名优秀的程序员,十分优秀!