c# - CPU、内存使用、线程池使用 - ASP NET core 身份未确认的邮件用户删除处理 - 在应用程序中还是单独的应用程序?

标签 c# asp.net-core asp.net-identity

我想知道什么是更合适的解决方案。 我需要实现机器人来检查和删除未经确认的注册用户,例如确认邮件发送后 7 天。 (如果用户未确认他/她的帐户,我想从数据库中删除该用户)。 我想了三种方法:

  1. 直接在 ASP NET Core 应用程序中实现委托(delegate)并运行它 循环中的异步任务,24 小时 sleep 。
  2. 创建一个控制台应用程序 它将在 24 小时 sleep 中循环运行
  3. 创建一个控制台应用程序 会定期由第三方软件启动 (例如 Cron 或 TaskScheduler)

以下哪种方式对 CPU 和内存使用的影响最小?
另外,线程池的数量有限,机器人越多,尝试访问我的 ASP 网站的线程就越少,我是否正确?
我的最后一个问题> Thread.Sleep 这么长时间是个好主意吗?有件事告诉我事实并非如此。另一方面,它是一个 ASP,将运行数月甚至数年。

无论如何,我喜欢将所有内容集成到一个应用程序中的愿景(可以在一个文件中进行配置,并且所有内容立即启动)。另一方面,有些事情告诉我这不是一个 super 好的主意。

最佳答案

当任务实际运行时,我希望内存和进程使用情况由任务所需的内容主导,并且每种方法都应该具有可比性。所以在不运行时查看资源使用情况应该会更有趣。

  1. 在进程中,使用计时器(或 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/

    相关文章:

    c# - WinRT 异步调用 Flyout.ShowAt()

    c# - MediatR 行为的约束违反异常

    asp.net-core - 如何在 aspnet vnext config.json 文件中配置 Entity Framework 拦截器?

    c# - 使用单独的类获取asp.net core identity中的所有角色

    c# - C# 存储大于 512 个长整型(4096 字节)的数组是否有所不同?

    c# - 在单击 RadioButton 之前保持按钮不可见 c#

    javascript - 如何使用我的数据库条目创建下拉列表?

    c# - ASP.NET 身份角色已存在

    c# - 从已发送的电子邮件网络核心身份调用时,重置密码不起作用

    c# - 具有相同View的ListView