https://mp.weixin.qq.com/s/xG9kRxBDIxk6yI6qlz1XJw
static void Main(string[] args)
{
string str = "当前时间是";
ThreadPool.SetMaxThreads(5,5);
for (int i = 0; i < 10; i++)
{
ThreadPool.QueueUserWorkItem(ThreadFuc, str);
}
Console.ReadKey();
}
public static void ThreadFuc(object str)
{
Console.WriteLine($"线程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");
Thread.Sleep(1000);
}
QueueUserWorkItem有两个重载,分别是带参数和不带参数的
public static bool QueueUserWorkItem(WaitCallback callBack);
public static bool QueueUserWorkItem(WaitCallback callBack, object state);
带参数的解释如下:
//
// 摘要:
// 将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。
//
// 参数:
// callBack:
// System.Threading.WaitCallback,它表示要执行的方法。
//
// state:
// 包含方法所用数据的对象。
//
// 返回结果:
// 如果此方法成功排队,则为 true;如果无法将该工作项排队,则引发 System.NotSupportedException。
//
// 异常:
// T:System.NotSupportedException:
// 承载公共语言运行时 (CLR),并且主机不支持此操作。
//
// T:System.ArgumentNullException:
// callBack 为 null。
SetMaxThreads用来设置可以同时处于活动状态的线程池的请求数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。函数原型如下
public static bool SetMaxThreads(int workerThreads, int completionPortThreads);
// 参数:
// workerThreads:
// 线程池中辅助线程的最大数目。
//
// completionPortThreads:
// 线程池中异步 I/O 线程的最大数目。
//
// 返回结果:
// 如果更改成功,则为 true;否则为 false。
线程池中的线程执行完指定的方法后并不会自动消除,而是以挂起状态返回线程池,如果应用程序再次向线程池发出请求,那么处以挂起状态的线程就会被激活并执行任务,而不会创建新线程,这就节约了很多开销。只有当线程数达到最大线程数量,系统才会自动销毁线程。因此,使用线程池可以避免大量的创建和销毁的开支,具有更好的性能和稳定性,其次,开发人员把线程交给系统管理,可以集中精力处理其他任务。
文档更新时间: 2022-10-05 08:37 作者:admin