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