gpt4 book ai didi

c# - ASP.NET Core 应用程序中每个用户一个长时间运行的进程

转载 作者:太空宇宙 更新时间:2023-11-03 23:04:00 25 4
gpt4 key购买 nike

我有一个异步函数,可以执行一些长时间运行和 CPU 密集型任务。由于它是异步的,因此不会占用 UI。

在正常情况下,我对它的运行方式没有任何问题。该过程在单击按钮时触发,但也可以在 API 调用时触发。

我发现,如果我快速连续多次点击按钮,整个网站就会开始响应缓慢。这是一种滥用类型,但它会对性能产生不利影响。

我想在内存中实现一个列表,记录用户对函数的调用,这样每个用户都可以拥有一个运行长时间运行的函数的实例,但它不会接受来自该用户的任何进一步请求。

谁知道实现这个的一些聪明的方法或者以前做过类似的事情。我正在考虑类似线程安全集合的东西,你可以向其中添加任务,但如果你尝试添加一个已经为特定用户/claimsprincipal 运行的任务,那么它将无法添加它。

最佳答案

您的解决方案存在一些问题:

  1. 如果任务是 CPU 密集型任务,即使它是 async,它仍然可以保持 UI。一旦所有 CPU 都处于忙碌状态,您就会看到性能受到的影响。
  2. 在网络服务器上长时间运行的任务不是一个好主意。 Web 服务器旨在处理大量短请求。长请求未得到有效处理,它们也可能在完成之前被回收。
  3. 您的实现使拒绝服务攻击变得容易。您基本上已经通过多次点击按钮创建了一个。

您应该将这些类型的任务卸载到更适合处理此类工作的应用服务器上。这使您的网络服务器可以自由地做它最擅长的事情:处理网络请求。

使用最适合您需求的 Web 和应用程序服务器之间的通信形式:WCF、REST API 或消息队列框架,例如 MSMQ 或 RabbitMQ。

关于c# - ASP.NET Core 应用程序中每个用户一个长时间运行的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42002868/

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