Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么线程池一次只启动一个线程?_C#_Multithreading_Threadpool - Fatal编程技术网

C# 为什么线程池一次只启动一个线程?

C# 为什么线程池一次只启动一个线程?,c#,multithreading,threadpool,C#,Multithreading,Threadpool,我完全按照书中所说的那样开始线程: for (int i = 1; i <= 4; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod), i); } 由于某种原因,2线程只在1完成后才开始(此时所有工作都已完成,2-4线程只是开始并停止不做任何事情) 有什么不对劲吗?问任何有助于解决这个问题的问题。 我不使用任何同步类 如果有问题的话,我有两个核心处理器。您的线程方法运行得太快了。你的代码一切正常,除了

我完全按照书中所说的那样开始线程:

for (int i = 1; i <= 4; i++) {
  ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod), i);
}
由于某种原因,2线程只在1完成后才开始(此时所有工作都已完成,2-4线程只是开始并停止不做任何事情)

有什么不对劲吗?问任何有助于解决这个问题的问题。 我不使用任何同步类


如果有问题的话,我有两个核心处理器。

您的
线程方法运行得太快了。你的代码一切正常,除了如果可能的话,你应该从
ThreadPool
切换到新的抽象,比如
Task。运行

实际上,由于我让ThreadMethod做了更长的工作,一段时间后又开始了另一个线程,但它在一个时间内不起作用,只是从一个线程切换到另一个线程。看起来我必须使用另一个工具。

一个跑步池可以使用的线程数是最大的。请参阅ThreadPool.GetMaxThread和SetMaxThread。默认情况下,它可能等于可用内核的数量


对于CPU密集型的工作来说,这是有意义的,因为使用的线程比内核多,实际上会降低性能。但是,对于I/O密集型作业等速度较慢的作业,许多线程可以并行运行以避免阻塞,并等待I/O完成。示例:一次从各种FTP服务器抓取多个文件。

您是否尝试使线程工作更长的时间(例如放置
Thread.Sleep()
),以查看它是否解决了问题。发布可执行的重新编写代码,以便我们可以看到您的意思并进行复制。线程池的工作方式与您的大脑一样。当你的老板同时给你4项新任务时,你也不会同时完成所有4项任务。你先完成一个,然后再转到另一个。如果需要很长时间才能完成一个任务,那么你可能会被迫提前开始另一个任务,这样就不会耽搁太久。也许我对此不确定。我需要结束这个项目,好好休息。现在我精神疲惫。
static void ThreadMethod(object input) {
  Console.WriteLine(input + " thread started");
  //do some stuff for, like, 400 milliseconds
  Console.WriteLine(input + " thread completed");
}