【发布时间】:2020-02-18 10:46:27
【问题描述】:
我已经制作了一个干净的 .net Core 3.0 Web 应用程序项目,我正在尝试了解 ThreadPool 在 C# 中的工作原理。
namespace TestASPSelf.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public static int countThread = 0;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
int workerThreads;
int portThreads;
ThreadPool.GetMaxThreads(out workerThreads, out portThreads);
Console.WriteLine("\nMaximum worker threads: \t{0}" +
"\nMaximum completion port threads: {1}",
workerThreads, portThreads);
ThreadPool.GetAvailableThreads(out workerThreads,
out portThreads);
Console.WriteLine("\nAvailable worker threads: \t{0}" +
"\nAvailable completion port threads: {1}\n",
workerThreads, portThreads);
Console.WriteLine("countThread = " + countThread);
return View();
}
class Z
{
public static void WaitTest(object o)
{
countThread++;
while (true)
{
Thread.Sleep(1000);
}
}
}
public IActionResult Privacy()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("starting thread "+i);
ThreadPool.QueueUserWorkItem(new WaitCallback(Z.WaitTest));
}
return View();
}
}
}
http://localhost:5000/Home/Privacy 打开时,它会挂起一段时间(大约 40-80 秒),但我知道,for 循环的逻辑几乎立即完成。
当http://localhost:5000/在那之后打开时,它也会挂起40-80秒,结果在控制台countThread = 100中。
启动线程时,应用的 CPU 使用率约为 5-10%。
我正在努力理解:
1) 第一个是为什么 ASP 控制器每页挂起 40-80 秒,当 100 个线程正在运行时,CPU 使用率为 5-10%。 CPU有很多资源,RAM也是空闲的,但是为什么页面的ASP Controller方法挂了?
2) 如何在 C# 中创建运行线程数有限的 ThreadPool?如果我正确理解方法public static bool SetMinThreads (int workerThreads, int completionPortThreads);,它会影响应用程序的全局所有线程。如何创建活动线程数有限的 ThreadPool 对象,如 Java 中的ExecutorService?例如,线程池的 Java 代码可能如下所示
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
Runnable worker = new WorkerThread("" + i);
executor.execute(worker);
}
executor.shutdown();
while (!executor.isTerminated()) {
}
3) 如何防止 ASP 控制器的所有方法挂起并创建“真正的”线程,就像在 Java 中一样?
【问题讨论】:
-
用 C# 开发时不要用 Java 思考。要实现所需的行为,有几种方法。忘记你对 Java 的了解,看看如何在 C# 中实现你想要的。例如,您可以自己启动 n 个线程,您可以使用设置了 maxParallelism 的 DataFlow,仅举个例子 2。
-
asp.net 本身就是一个多线程环境:每个请求都有自己的线程
-
致 Fildor:结果,我使用本教程解决了任务 - docs.microsoft.com/en-us/dotnet/standard/parallel-programming/…。感谢您使用 DataFlow 的想法。能否请您写一个关于 DataFlow 的答案,我会将答案标记为正确?
标签: c# asp.net multithreading .net-core