gpt4 book ai didi

c# - 从 Controller 返回而不等待异步方法完成

转载 作者:行者123 更新时间:2023-12-03 19:07:06 24 4
gpt4 key购买 nike

我读过自己的蓝色,希望有一个简单的答案。

我有一个 Web API 可以处理来自“野外”各种应用程序的遥测 在我的一个 Controller 中,我希望收到一个请求,将错误记录到我的中央监控数据库并尽可能立即返回响应(我没有真正的知道调用者端的性能有多重要的方法,并且已经对发出初始 Web 服务请求产生了重大影响)。

本质上,我正在寻找的是这样的:

public IHttpActionResult Submit() {
try {
var model = MyModel.Parse(Request.Content.ReadAsStringAsync().Result);

// ok, I've got content, now log it but don't wait
// around to see the results of the logging, just return
// an Accepted result and begone

repository.SaveSubmission(model); // <-- fire and forget, don't wait

return Accepted();

} catch (Exception)
return InternalServerError();
}
}

看起来它应该是直截了当的,但显然不是。我已经阅读了许多不同的帖子,表明一切,从是的,只需使用 Task.Run() 到这是一个可怕的错误,你永远无法实现你想要的!

我的场景中的问题似乎是这个进程可能会在进程中终止,因为它在 ASP.NET 工作进程上运行,而不管调用异步方法的不同方法的泥潭(我已经用了最后两个几个小时左右阅读各种 SO 问题和 Stephen Cleary 博客......哇)。

如果这种情况下的根本问题是我“解雇并忘记”的方法绑定(bind)到 http 上下文并受到 ASP.NET 工作进程的提前终止,那么我的问题就变成了......

有没有办法从那个 ASP.NET 上下文中删除这个方法/任务/进程?一旦该请求被解析到模型中,我自己就不再需要在 http 上下文中进行操作了。如果有一种简单的方法可以将它移出那里(从而让事情运行,除非网站/应用程序池重新启动),那就太好了。

为了尽职调查,假设我摆脱了 Controller 中的存储库上下文并将其委托(delegate)给其他一些上下文:
public IHttpActionResult Submit() {
try {
var model = MyModel.Parse(Request.Content.ReadAsStringAsync().Result);

SomeStaticClass.SaveSubmission(model); // <-- fire and forget, don't wait

return Accepted();

} catch (Exception)
return InternalServerError();
}
}

...那么唯一必须“跨界”的是模型本身 - 没有其他代码逻辑依赖项。

诚然,我可能正在做一座小山 - 插入数据库不会花费一小部分时间......不过看起来应该很容易,而且我显然太固执而无法满足今晚“足够好”。

最佳答案

好的,找到了更多对我的场景有帮助的内容。它的基本要点似乎是不要这样做。

为了正确地做到这一点,需要将其提交给分布式架构中的单独组件(例如,某种消息或服务队列,可以单独提取以进行处理)。这似乎是完全脱离 ASP.NET 工作进程的唯一方法。

一个 S/O 评论(指向另一个 S/O 帖子)将我引向了两篇我在发布之前尚未看到的文章:一篇由 Stephen Cleary 撰写,另一篇由 Phil Haack 撰写。

SO感兴趣的帖子:How to queue background tasks in ASP.NET Web API

Stephen's Fire and Forget on ASP.NET blog post(非常好,希望我先找到这个):http://blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html

和菲尔的文章:http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx/

Stephen 的以下项目可能也很有趣:https://github.com/StephenCleary/AspNetBackgroundTasks

我以为我会删除我的问题,但后来发现我花了很长时间才找到我的答案,也许另一个漂浮在 SO 周围的问题不会受到伤害......

(在这种特殊情况下,提交到另一个服务的时间与写入数据库一样长,所以我可能会放弃这个 api 方法的异步处理,但至少现在我知道我什么时候真正需要去做吧)

关于c# - 从 Controller 返回而不等待异步方法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36098008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com