C# 异步多线程入门到精通之ThreadPool篇攻略
在C#程序中,如果需要同时执行多个任务,则要使用多线程技术。但是在使用多线程时,我们需要注意资源竞争和死锁的问题。如果不处理好这些问题,程序可能会出现异常错误。
C#提供了ThreadPool类,可以简化多线程的编程。ThreadPool类可以在应用程序中创建一个线程池,然后将多个任务加入到线程池中,线程池会自动分配线程执行任务,避免了手动管理线程带来的麻烦。
下面,详细讲解C#异步多线程入门到精通之ThreadPool篇攻略。
一、创建线程池
使用ThreadPool类的第一步是创建一个线程池。在创建线程池时,需要指定线程池中最大的工作线程数目。例如:
int maxThreadCount = 5;
ThreadPool.SetMaxThreads(maxThreadCount, maxThreadCount);
以上代码创建了一个最大工作线程数为5的线程池。
二、添加任务
接下来,需要将需要执行的任务加入到线程池中。例如:
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), i);
以上代码将一个待执行的委托DoWork使用线程池执行,并传递一个参数i给DoWork委托。
三、任务执行函数
我们需要定义一个待执行的委托函数。例如:
private static void DoWork(object state)
{
int i = (int)state;
Console.WriteLine($"Task {i} is start to work on thread {Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(i * 1000);
Console.WriteLine($"Task {i} is done on thread {Thread.CurrentThread.ManagedThreadId}");
}
以上代码定义了一个连续睡眠一定时间后输出任务完成的委托函数DoWork。
四、完整示例
本节将提供两个完整的示例。
使用线程池打印数据。
using System;
using System.Threading;
namespace ThreadPoolDemo
{
class Program
{
static void Main(string[] args)
{
int maxThreadCount = 5;
ThreadPool.SetMaxThreads(maxThreadCount, maxThreadCount);
for (int i = 0; i < 10; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(Print), i);
}
Console.ReadKey();
}
private static void Print(object state)
{
int i = (int)state;
Console.WriteLine($"Task {i} is working on thread {Thread.CurrentThread.ManagedThreadId}");
}
}
}
等待所有线程完成后输出Done。
using System;
using System.Threading;
namespace ThreadPoolDemo
{
class Program
{
static void Main(string[] args)
{
int maxThreadCount = 5;
ThreadPool.SetMaxThreads(maxThreadCount, maxThreadCount);
ManualResetEvent done = new ManualResetEvent(false);
for (int i = 0; i < 10; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), new Tuple<int, ManualResetEvent>(i, done));
}
done.WaitOne();
Console.WriteLine("Done.");
}
private static void DoWork(object state)
{
Tuple<int, ManualResetEvent> tuple = (Tuple<int, ManualResetEvent>)state;
int i = tuple.Item1;
ManualResetEvent done = tuple.Item2;
Console.WriteLine($"Task {i} is start to work on thread {Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(i * 1000);
Console.WriteLine($"Task {i} is done on thread {Thread.CurrentThread.ManagedThreadId}");
if (i == 9)
{
done.Set();
}
}
}
}
以上两个示例分别演示了线程池并行打印的例子和等待所有线程池任务完成后输出Done的案例。
本篇攻略中,主要讲解了C#异步多线程入门到精通之ThreadPool篇相关知识,包括创建线程池、添加任务和任务执行函数。同时,我们还提供了完整的示例程序,方便大家理解和使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 异步多线程入门到精通之ThreadPool篇 - Python技术站