首页 > 解决方案 > 在 ASP .Net Core 3.0 项目中延迟获取工作线程

问题描述

在 ASP .Net Core 3.0 项目中获取工作线程/池线程时,我们的应用程序遇到延迟。

在较新的语言中,这实际上意味着在生成任务时,Task.Start() 命令与执行任务的第一行代码之间的时间。本质上是线程池管理进程创建线程所花费的时间。

需要记住的一些因素:

  1. 在询问时,有 600 多个免费工作线程/池线程。

  2. 执行此操作的代码位于 ASP .Net Core 3.0 主机应用程序引用的 .Net Framework 4.7.2 应用程序中。

  3. 并不总是有延迟,但是当有延迟时,所有从同一个 4.7.2 组件请求工作线程的项目都会受到它的影响。时间各不相同,但我似乎是 300 毫秒。

  4. 该应用程序当时没有承受重负载,内存使用率和 CPU 使用率处于正常水平。

  5. 请求工作线程/池线程的代码以 .Net 1.1 样式执行:

    System.Threading.ThreadPool.QueueUserWorkItem(MethodName, e);
  1. 我们在 Program.cs 的 void Main 中发出此命令:
    ThreadPool.SetMinThreads(1000, 1000);

标签: c#asp.net-core

解决方案


我认为您将 ThreadPool 用于不应该使用的东西。这是Silverlight 官方文档所说的,这很可能也适用于 .Net Framework 4:

何时不使用线程池线程

在以下场景中,最好创建和管理自己的线程,而不是使用线程池线程:

  1. 您需要在很短的时间内启动多个线程,以执行持续一秒或更长时间的任务。作为其线程管理策略的一部分,线程池在创建线程之前会延迟。因此,当许多任务在短时间内排队时,在所有任务启动之前可能会有很大的延迟。

推荐阅读