使用线程池

问题描述:

我的问题是: 我想用多线程TECHNIC工作 所以我用的线程池,但我要的是下面 我想确定线程池的大小,当程序被启动 时,我有要管理的数据,我将从ThreadPool中使用一个线程来处理这个项目, ,因为我已经阅读过,您可以根据需要在threadPool中定义项目,但每个线程都将自动运行我想要控制线程以确定何时线程应运行 如果没有数据线程应等待(或停止)当我有一个新的数据(这就像一个请求) 其中一个线程将运行.....谢谢使用线程池

+3

WTF。这里没有问题。问题以问号(?)结尾。除此之外,这是一个漫无边际的思想。说真的,我在这里甚至找不到单独的句子。投票到关闭。 – abelenky 2009-10-21 21:22:45

使用ThreadPool时,您通常会使用一些(可选)输入数据将请求排列到池中,这会导致池选择可用线程并运行该进程。完成后,该线程返回到池中,并可用于其他请求。你通常不需要费心管理线程,但可以简单地排队一个工作项需要的时候:

DataToWorkWith dataItem = GetDataToWorkWith(); 
if (dataItem != null) 
{ 
    ThreadPool.QueueUserWorkItem(MyProcessingMethod, dataItem); 
} 


// somewhere else in the class 
private void MyProcessingMethod(object dataItem) 
{ 
    // work with the dataItem; this will run on a threadpool thread, if 
    // invoked through the thread pool 
} 

因此,所有你需要做的是建立一些过程搞清楚,如果有数据工作将请求排列在ThreadPool中并让它完成工作。

以下是关于C# ThreadPool Usage的简短摘要。以下是MSDN How To: Use a ThreadPool。这里是ThreadPool参考。

特别是,您可以使用GetAvailableThreads获得可用的线程。您还可以使用SetMinThreadsSetMaxThreads来控制线程池中的最小和最大线程数。

一般来说,我会建议不要搞乱线程的数量,除非你确切地知道你在做什么。线程池由您和CLR组件共享,因此通过更改线程数可以影响CLR行为。有关更多详细信息,请阅读ThreadPool类文档中的备注部分。

您通常不会手动管理ThreadPool中的线程。建议的用法是将代理队列作为Fredrik的示例,并让ThreadPool管理线程。有了这个约定,如果没有数据,你不应该排队任何工作。当数据可用时,您可以排队工作。如果您正在寻找运行后台进程的方式,那么在您的应用程序启动时,您可以创建Timer并将其添加到应用程序的状态,或者您可以定义一个静态类来管理Timer,并在应用程序启动时触摸该类。