Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
.net 什么';使用线程池和普通线程有什么区别?_.net_Multithreading - Fatal编程技术网

.net 什么';使用线程池和普通线程有什么区别?

.net 什么';使用线程池和普通线程有什么区别?,.net,multithreading,.net,Multithreading,我在这里随机阅读了一些问题和答案,发现了这个问题: 问题是X方法是使用线程池还是使用普通线程 使用线程池和普通线程有什么区别?线程池创建线程并将工作分配给空闲线程。这种为每个工作项创建和处理线程的方式是不可取的,因为创建和处理线程是一项相对昂贵的操作。线程池中有许多线程可供您使用,这可能会消除创建新线程的成本,这就是创建普通线程时发生的情况。线程池通常适用于短时间运行的任务。它有一个局限性,即它是一个应用程序范围的有限资源(每个CPU 25个),并且有许多内部类使用threadpoool,因此

我在这里随机阅读了一些问题和答案,发现了这个问题:

问题是X方法是使用线程池还是使用普通线程


使用线程池和普通线程有什么区别?

线程池创建线程并将工作分配给空闲线程。这种为每个工作项创建和处理线程的方式是不可取的,因为创建和处理线程是一项相对昂贵的操作。

线程池中有许多线程可供您使用,这可能会消除创建新线程的成本,这就是创建普通线程时发生的情况。

线程池通常适用于短时间运行的任务。它有一个局限性,即它是一个应用程序范围的有限资源(每个CPU 25个),并且有许多内部类使用threadpoool,因此,如果执行大量长时间运行的任务,则会耗尽所有线程

对于长时间运行的任务,最好使用手动创建的线程,并将其后台属性设置为true

注意:在.NET Framework 2.0版中,
Thread.CurrentPrincipal
属性值被传播到使用
QueueUserWorkItem
方法排队的工作线程。在早期版本中,不会传播主体信息

何时不使用线程池线程

有几种情况适合创建和管理自己的线程,而不是使用线程池线程:

  • 您需要一个前台线程(!)

  • 您需要一个线程具有特定的优先级

  • 您的任务会导致线程长时间阻塞。线程池具有最大数量的线程,因此大量阻塞的线程池线程可能会阻止任务启动

  • 您需要将线程放置到单线程单元中。所有线程池线程都在多线程单元中

  • 您需要有一个与线程关联的稳定标识,或者将一个线程专用于一个任务

一个很大的区别是线程池线程上未处理的异常会终止进程;除了这三个例外:

  • 线程池线程中会抛出
    ThreadAbortException
    ,因为调用了
    Abort

  • 由于正在卸载应用程序域,因此将在线程池线程中抛出
    AppDomainUnloadexException

  • 公共语言运行库或主机进程终止线程

以下是一些很好的参考资料:


更新:回应评论。您可以使用
GetAvailableThreads
方法来确定在任何给定时间线程池中的实际线程数<代码>线程池。GetMaxThreads是不同的数量。它是请求排队前池中允许的最大值,而不是池中当前的实际线程数。

不同的线程之间并没有区别,因为它们的行为相同,区别在于谁管理线程的生存期以及如何使用它们

net中的线程池是一个线程池,它将增长或收缩,当您排队等待线程池处理时,它将确定是否需要启动新线程或重用现有线程。您不必显式地创建线程

这很好,但其缺点是线程池中可用的线程数量有限,因此,如果将长时间运行的任务排队,这可能会对应用程序产生负面影响,因为您可能正在使用其他线程池中可能需要使用的线程


有关线程池的信息,请参见此部分。

根据文档,线程池默认为每个处理器维护250个工作线程。如果要确保线程在应用程序关闭前完成其工作,某些长时间运行的任务可能需要将后台属性设为false(当然这并不能保证它会关闭,但至少在正常情况下不会关闭)@Fredrik Mörk:听起来像是打字错误。25%core@Mitch:我刚刚通过调用ThreadPool.GetMaxThreads进行了检查,它返回500(在双核计算机上)。@Mitch Wheat@Josh这不是一种类型,数字根据框架版本的不同而不同