我想知道什么是更合适的解决方案。 我需要实现机器人来检查和删除未经确认的注册用户,例如确认邮件发送后 7 天。 (如果用户未确认他/她的帐户,我想从数据库中删除该用户)。 我想了三种方法:
- 直接在 ASP NET Core 应用程序中实现委托(delegate)并运行它 循环中的异步任务,24 小时 sleep 。
- 创建一个控制台应用程序 它将在 24 小时 sleep 中循环运行
- 创建一个控制台应用程序 会定期由第三方软件启动 (例如 Cron 或 TaskScheduler)
以下哪种方式对 CPU 和内存使用的影响最小?
另外,线程池的数量有限,机器人越多,尝试访问我的 ASP 网站的线程就越少,我是否正确?
我的最后一个问题> Thread.Sleep 这么长时间是个好主意吗?有件事告诉我事实并非如此。另一方面,它是一个 ASP,将运行数月甚至数年。
无论如何,我喜欢将所有内容集成到一个应用程序中的愿景(可以在一个文件中进行配置,并且所有内容立即启动)。另一方面,有些事情告诉我这不是一个 super 好的主意。
最佳答案
当任务实际运行时,我希望内存和进程使用情况由任务所需的内容主导,并且每种方法都应该具有可比性。所以在不运行时查看资源使用情况应该会更有趣。
- 在进程中,使用计时器(或
await Task.Delay(..)
循环)
这只需要计时器或异步状态机的内存,以及代码的一些额外内存。这应该相当小,也许只有几千字节。空闲时不会使用处理器时间和线程。这假设您不持有任何大型数据结构。
- 在单独的持久控制台进程中
这将使用几 MB 的内存用于 .Net 运行时,以及一些额外的内存用于代码和数据。在实践中,如果计算机内存不足,我希望内存被分页到磁盘。空闲时不会使用处理器时间。
- 在单独的计划控制台进程中
这只会消耗调度程序对象的内存,并且这应该是最小的。显然,空闲时不会使用处理器时间或线程。
摘要
安排一个单独的进程将使用最少的资源。但所有方法在空闲时都应该使用相当少量的资源。因此,我认为应该根据其他标准做出选择,例如最容易维护和/或部署的标准。
如果需要,线程池将分配更多线程。一般来说,线程应该只在它们实际做某事时使用(即使用 await task
而不是 task.Wait()
),并且您将拥有更多的线程池线程比你拥有硬件线程。只有当我观察到线程数量比平常多得多时,我才会担心这一点。
如果可能的话,我会避免Thread.Sleep
。计时器或 await Task.Delay
通常更合适。
关于c# - CPU、内存使用、线程池使用 - ASP NET core 身份未确认的邮件用户删除处理 - 在应用程序中还是单独的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63484503/