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