线程是进程中最小的执行单元。 多线程是在给定时间在内存中具有多个线程并在它们之间切换以同时处理多个操作的能力。 Microsoft的.Net Framework为使用线程提供了出色的支持。
C#中的编程线程
要使用线程,应在应用程序中包括System.Threading命名空间。 要创建一个新线程,您应该利用ThreadStart委托并将引用传递给应该在线程上执行的方法。 请注意,委托是类型安全的函数指针。 以下代码段显示了如何使用此委托创建新的线程对象。
Thread t = new Thread(new ThreadStart(MyThreadMethod));
要启动新创建的线程,应在已创建的线程对象上调用Start方法。 下面的代码清单对此进行了说明。 请注意,线程方法MyThreadMethod在已创建的新线程(称为工作线程)上执行。
static void Main()
{
Thread t = new Thread(new ThreadStart(MyThreadMethod));
t.Start();
Console.Read();
}
static void MyThreadMethod()
{
Console.WriteLine(“Hello World!”);
}
在C#中显示线程状态
内存中的线程可以处于不同的状态-终止,后台,正在运行,已停止,已挂起,未启动等。线程状态在System.Threading命名空间中可用的ThreadState枚举中定义。 除非在线程上调用Start方法,否则线程将处于Unstarted状态。 在线程实例上调用Start方法时,线程的状态从“未启动”变为“正在运行”。
以下代码段显示了如何在控制台中显示线程的状态。
Thread t = new Thread(new ThreadStart(MyThreadMethod));
t.Start();
Console.WriteLine(“The thread’s state is: “ + t.ThreadState.ToString());
在C#中控制前台线程和后台线程
线程可以在前台运行,也可以在后台运行。 您显式创建的线程是前台线程。 前台线程和后台线程之间的主要区别之一是,应用程序仅在运行一个或多个前台线程的情况下才能生存。 本质上,前台线程可防止应用程序终止。 相比之下,后台线程不能使公共语言运行时环境保持活动状态。
您可以使用IsBackground属性设置线程的背景状态。 这是一个代码示例,显示了如何实现此目的。
static void Main()
{
Thread t = new Thread(new ThreadStart(MyThreadMethod));
t.Start();
t.IsBackground = true;
Console.WriteLine(“The thread’s background status is: “+t.IsBackground.ToString());
Console.Read();
}
您可以通过在线程对象上调用Suspend()和Resume()方法来挂起或恢复线程。 请注意,只能通过调用Suspend()方法来恢复先前已暂停的线程。
Thread t = new Thread(new ThreadStart(MyThreadMethod));
t.Start();
t.Suspend(); //Suspends the newly created thread
t.Resume(); //Resumes the suspended thread
但是,应注意,不赞成使用Thread.Suspend()和Thread.Resume()方法。 而是应该使用AutoResetEvent和EventWaitHandle方法来同步涉及线程的活动。
在C#中设置线程优先级
您可以控制线程的优先级,以确定一个线程与驻留在内存中的其他线程相比将获得的处理器时间的相对份额。 线程优先级在ThreadPriority枚举中定义。 可能的值包括:最低,低于正常,正常,高于正常和最高。 以下代码段说明了如何使用线程对象的Priority属性设置两个线程的线程优先级。
static void Main()
{
Thread thread1 = new Thread(new ThreadStart(Method1));
Thread thread2 = new Thread(new ThreadStart(Method2));
thread1.Priority = ThreadPriority.Highest;
thread2.Priority = ThreadPriority.Lowest;
thread2.Start();
thread1.Start();
Console.Read();
}
static void Method1()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(“First thread: “ + i);
}
}
static void Method2()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(“Second thread: “ + i);
}
}
当您执行上述代码片段时,即使第二个线程在Main方法中的第一个线程之前启动,您也会看到第一个线程在第二个线程之前完成了其执行。
线程很昂贵。 它们消耗系统中的大量资源用于初始化,切换上下文以及释放它们消耗的资源。 因此,仅在需要时才应谨慎使用多线程。 当您确实利用多线程时,始终建议利用线程池按需创建和管理线程并提高应用程序的响应能力。
From: https://www.infoworld.com/article/3035134/how-to-work-with-threads-in-c.html