推荐答案
// www.javascriptcn.com code example
using System;
using System.Threading;
class Program
{
static void Main(string[] args)
{
// 使用 ThreadPool 执行任务
ThreadPool.QueueUserWorkItem(DoWork, "Task 1");
ThreadPool.QueueUserWorkItem(DoWork, "Task 2");
Console.WriteLine("Main thread does some work, then sleeps.");
Thread.Sleep(1000); // 模拟主线程工作
Console.WriteLine("Main thread exits.");
}
static void DoWork(object state)
{
string taskName = (string)state;
Console.WriteLine($"{taskName} is running on thread {Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(500); // 模拟任务执行
Console.WriteLine($"{taskName} completed.");
}
}本题详细解读
线程池的作用
线程池(ThreadPool)是 C# 中用于管理和复用线程的机制。它的主要作用是减少线程创建和销毁的开销,从而提高应用程序的性能。线程池中的线程是预先创建好的,并且可以重复使用,避免了频繁创建和销毁线程带来的性能损耗。
线程池的用法
在 C# 中,可以通过 ThreadPool.QueueUserWorkItem 方法将任务提交到线程池中执行。该方法接受一个 WaitCallback 委托和一个可选的 object 参数。WaitCallback 委托表示要执行的任务,而 object 参数可以用于传递任务所需的参数。
示例代码解析
提交任务到线程池:
ThreadPool.QueueUserWorkItem(DoWork, "Task 1"); ThreadPool.QueueUserWorkItem(DoWork, "Task 2");
这两行代码将两个任务
Task 1和Task 2提交到线程池中执行。DoWork是任务的具体实现,"Task 1"和"Task 2"是传递给任务的参数。任务执行:
static void DoWork(object state) { string taskName = (string)state; Console.WriteLine($"{taskName} is running on thread {Thread.CurrentThread.ManagedThreadId}"); Thread.Sleep(500); // 模拟任务执行 Console.WriteLine($"{taskName} completed."); }DoWork方法接收一个object类型的参数state,并将其转换为字符串taskName。然后,它输出当前任务的名称和线程 ID,并模拟任务执行 500 毫秒,最后输出任务完成的信息。主线程工作:
Console.WriteLine("Main thread does some work, then sleeps."); Thread.Sleep(1000); // 模拟主线程工作主线程在执行完任务提交后,继续执行其他工作,并休眠 1000 毫秒,以等待线程池中的任务完成。
主线程退出:
Console.WriteLine("Main thread exits.");主线程在完成所有工作后退出。
注意事项
- 线程池中的线程是后台线程,这意味着如果主线程退出,所有未完成的后台线程也会被终止。
- 线程池适合执行短时间的任务,长时间运行的任务可能会影响线程池的性能。
- 线程池的线程数量是有限的,过多的任务可能会导致任务排队等待执行。