C#中,创建子线程与Task任务相比,能够循环执行特定操作,可以用于长期监听TCP消息,发送心跳等。
本文对C#的多线程简单封装一下,哎,以方便线程的创建和命名。
不带参数的
定义
using System.Threading;
/// <summary>
/// 线程的工作函数类型
/// </summary>
public delegate void WorkProc();
/// <summary>
/// 创建进程的函数
/// </summary>
/// <param name="work">进程要执行的函数</param>
/// <param name="tName">进程的名称</param>
public static void CreateWorkThread(WorkProc work, string tName)
{
Thread thread = new Thread(new ThreadStart(work)); // 创建一个新线程,指定线程要执行的方法为 work
thread.Name = tName; // 设置线程的名称为 tName
thread.IsBackground = true; // 将线程设置为后台线程,这意味着当主线程结束时,该线程也会被终止
thread.Start(); // 启动线程,使其开始执行指定的工作方法
}
应用
CreateWorkThread(() =>
{
while (true)
{
try
{
// 要执行的代码
}
catch (Exception ex)
{
Console.WriteLine($"报错:{ex}");
}
}
}, "MyThread4Test");
带参数的
参考:ParameterizedThreadStart 委托 和 Semaphore 类示例。
定义
/// <summary>
/// 带参数的工作函数类型
/// </summary>
/// <param name="obj">参数类型需要是Object(可以封装其他类型为1个)</param>
public delegate void ParamedWorkProc(object obj);
/// <summary>
/// 创建进程的函数
/// </summary>
/// <param name="work">进程要执行的函数</param>
/// <param name="tName">进程的名称</param>
/// <param name="param">进程的参数</param>
public static void CreateWorkThread(ParamedWorkProc work, string tName, object param)
{
Thread thread = new Thread(new ParameterizedThreadStart(work)); // 创建一个新线程,指定线程要执行的方法为 work
thread.Name = tName; // 设置当前线程名称为 tName
thread.IsBackground = true; // 将线程设置为后台线程,这意味着当主线程结束时,该线程也会被终止
thread.Start(param); // 启动线程,并将参数传递给work函数
}
应用
public static void Main()
{
// 创建5个进程
for (int i = 1; i <= 5; i++)
{
CreateWorkThread((num) =>
{
Console.WriteLine("Thread {0} begins ", num); // 开始
Thread.Sleep(1000); // 工作负载
Console.WriteLine("Thread {0} exits", num); // 结束
}, $"Thread{i}", i); // 还有:线程名,工作线程的参数
}
Console.ReadLine();
}