none
关于threadpool的若干概念和问题,麻烦大家了 RRS feed

  • 问题

  • 首先这是我目前了解到关于threadpool的一些概念,大家先帮忙看看是否正确

    1.threadpool内创建的线程与其他的自己创建的线程(thread或者异步委托)是完全两回事,运行在不同的地方,不管自己创建了多少线程以及工作状况如何,都跟threadpool没关系

    2.threadpool是运行在全局的,程序集内任何一个代码调用ThreadPool.SetMaxThreads方法修改了值,会影响到其他正在执行的代码

    以上是我对threadpool的理解,大家帮忙看看是否正确,下面是我遇到的问题,首先我有一个方法,要求是根据每个方法对应的调用时间规则,到了时间去调用对应的方法,并且同一时间内,要可以限制同时被调用的方法数量(举例来说,我限制最多调用五个方法,但是同一时间内,八个方法到了调用时间,要求剩下的加入队列,等着五个中的任一一个调用完随时补充进去)

    我之前用的思路是这样,程序运行时所有方法全部新开一个线程进行计时操作,到了事件,把方法加入threadpool中剩下的不管了,但是发现ThreadPool.SetMaxThreads这个方法不管怎么设置都达不到要求(比如设置为5结果同时运行的为2,这里也请教大家,ThreadPool.SetMaxThreads的两个参数到底代表什么,比如我想设置同时只能有五个方法运行,队列中可以容乃一千个,如何设置?

    2011年4月23日 16:00

答案

  • 您好,

    >ThreadPool.SetMaxThreads这个方法不管怎么设置都达不到要求

    这个方法有个返回值,我不清楚你这个这个方法之后是否返回”true“。如果返回的不是“true”就表明你的设置是不成功的。

    >ThreadPool.SetMaxThreads这个方法不管怎么设置都达不到要求(比如设置为5结果同时运行的为2,这里也请教大家,ThreadPool.SetMaxThreads的两个参数到底代表什么,比如我想设置同时只能有五个方法运行,队列中可以容乃一千个,如何设置?

    关于这个问题, 你可以参考一下MSDN文档中的说明: http://msdn.microsoft.com/zh-cn/library/system.threading.threadpool.setmaxthreads(VS.80).aspx

    而且你在设置这两个属性的时候,要注意一下几点:

    1. 不能将辅助线程的数目或 I/O 完成线程的数目设置为小于计算机的处理器数目。2
    2. 如果公共语言运行库是被承载的,例如被 IIS 或 SQL Server 承载,主机可能会限制或禁止更改线程池大小。
    3. 更改线程池中的最大线程数时需谨慎。虽然这类更改可能对您的代码有益,但对您使用的代码库可能会有不利的影响。
    4. 将线程池大小设置得太大可能导致性能问题。如果同时执行的线程太多,任务切换开销就成为影响性能的一个主要因素。
    5. Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows CE 平台说明: 可设置的最大值为 1000。

    这里有个博客,你可以参考下:http://blog.163.com/freeprogman@yeah/blog/static/81791674200792184157391/

    This response contains a reference to a third party World Wide Web site. Microsoft is providing this information as a convenience to you. Microsoft does not control these sites and has not tested any software or information found on these sites; therefore, Microsoft cannot make any representations regarding the quality, safety, or suitability of any software or information found there. There are inherent dangers in the use of any software found on the Internet, and Microsoft cautions you to make sure that you completely understand the risk before retrieving any software from the Internet.


    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Aspen VJ 2011年5月3日 1:51
    2011年4月26日 1:39
  • dear

    ThreadPool.SetMaxThreads是设定ThreadPool同时间的上限数量,ThreadPool是静态类,改一次属性当然就可以套用 http://blog.miniasp.com/post/2009/04/10/The-thread-pool-worker-threads-per-available-processor.aspx

    ThreadPool是Thread的简易版,它是利用Queue机制来节省不必要的Thread等待,参考以下文章,你会更有感觉 http://columns.chicken-house.net/post/2007/12/14/ThreadPool-e5afa6e4bd9c-1-e59fbae69cace6a682e5bfb5.aspx http://columns.chicken-house.net/post/2007/12/17/ThreadPool-e5afa6e4bd9c-2-e7a88be5bc8fe7a2bc-%28C%29.aspx http://columns.chicken-house.net/post/ThreadPool-e5afa6e4bd9c-3-AutoResetEvent-ManualResetEvent.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    • 已标记为答案 Aspen VJ 2011年5月3日 1:51
    2011年4月26日 5:25

全部回复

  • 您好,

    >ThreadPool.SetMaxThreads这个方法不管怎么设置都达不到要求

    这个方法有个返回值,我不清楚你这个这个方法之后是否返回”true“。如果返回的不是“true”就表明你的设置是不成功的。

    >ThreadPool.SetMaxThreads这个方法不管怎么设置都达不到要求(比如设置为5结果同时运行的为2,这里也请教大家,ThreadPool.SetMaxThreads的两个参数到底代表什么,比如我想设置同时只能有五个方法运行,队列中可以容乃一千个,如何设置?

    关于这个问题, 你可以参考一下MSDN文档中的说明: http://msdn.microsoft.com/zh-cn/library/system.threading.threadpool.setmaxthreads(VS.80).aspx

    而且你在设置这两个属性的时候,要注意一下几点:

    1. 不能将辅助线程的数目或 I/O 完成线程的数目设置为小于计算机的处理器数目。2
    2. 如果公共语言运行库是被承载的,例如被 IIS 或 SQL Server 承载,主机可能会限制或禁止更改线程池大小。
    3. 更改线程池中的最大线程数时需谨慎。虽然这类更改可能对您的代码有益,但对您使用的代码库可能会有不利的影响。
    4. 将线程池大小设置得太大可能导致性能问题。如果同时执行的线程太多,任务切换开销就成为影响性能的一个主要因素。
    5. Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows CE 平台说明: 可设置的最大值为 1000。

    这里有个博客,你可以参考下:http://blog.163.com/freeprogman@yeah/blog/static/81791674200792184157391/

    This response contains a reference to a third party World Wide Web site. Microsoft is providing this information as a convenience to you. Microsoft does not control these sites and has not tested any software or information found on these sites; therefore, Microsoft cannot make any representations regarding the quality, safety, or suitability of any software or information found there. There are inherent dangers in the use of any software found on the Internet, and Microsoft cautions you to make sure that you completely understand the risk before retrieving any software from the Internet.


    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Aspen VJ 2011年5月3日 1:51
    2011年4月26日 1:39
  • dear

    ThreadPool.SetMaxThreads是设定ThreadPool同时间的上限数量,ThreadPool是静态类,改一次属性当然就可以套用 http://blog.miniasp.com/post/2009/04/10/The-thread-pool-worker-threads-per-available-processor.aspx

    ThreadPool是Thread的简易版,它是利用Queue机制来节省不必要的Thread等待,参考以下文章,你会更有感觉 http://columns.chicken-house.net/post/2007/12/14/ThreadPool-e5afa6e4bd9c-1-e59fbae69cace6a682e5bfb5.aspx http://columns.chicken-house.net/post/2007/12/17/ThreadPool-e5afa6e4bd9c-2-e7a88be5bc8fe7a2bc-%28C%29.aspx http://columns.chicken-house.net/post/ThreadPool-e5afa6e4bd9c-3-AutoResetEvent-ManualResetEvent.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    • 已标记为答案 Aspen VJ 2011年5月3日 1:51
    2011年4月26日 5:25