一、多线程的概念
我们通常理解的应用程序就是一个*.exe文件,当运行*.exe应用程序以后,系统会在内存中为该程序分配一定的空间,同时加载一些该程序所需的资源,其实这就可以称为创建了一个进程。而线程则只是进程中的一个基本执行单元。进程会包含一个进入此入口的线程,我们称之为主线程main。然当在程序处理一个很耗时的任务,如输出一个大的文件或远程访问数据库等,此时的窗体界面程序对用户而言基本像是没反应一样,菜单、按钮等都用不了。因为窗体上控件的响应事件也是需要主线程来执行的,而主线程正忙着干其他的事,控件响应事件就只能排队等着主线程忙完了再执行。为了克服单线程的这个缺陷,Win32 API可以让主线程再创建其他的次线程,但不论是主线程还是次线程都是进程中独立的执行单元,可以同时访问共享的数据,这样就有了多线程这个概念。
二、C#中的多线程
C#中主要使用Thread类进行线程操作,位于System.Threading命名空间下,提供了一系列进行多线程编程的类和接口,有线程同步和数据访问的Mutex、Monitor、Interlocked和AutoResetEvent类,以及ThreadPool类和Timer类等。
首先使用new Thread()创建出新的线程,然后调用Start方法使得线程进入就绪状态,得到系统资源后就执行,在执行过程中可能有等待、休眠、死亡和阻塞四种状态。正常执行结束时间片后返回到就绪状态。如果调用Suspend方法会进入等待状态,调用Sleep或者遇到进程同步使用的锁机制而休眠等待。
Thread类主要用来创建并控制线程,设置线程的状态、优先级等。创建线程的时候使用ThreadStart委托或者ParameterizedThreadStart委托来执行线程所关联的部分代码(也就是工作线程的运行代码)。
在 C# 中,System.Threading.Thread 类用于线程的工作。它允许创建并访问多线程应用程序中的单个线程。进程中第一个被执行的线程称为主线程。
当 C# 程序开始执行时,主线程自动创建。使用 Thread 类创建的线程被主线程的子线程调用。您可以使用 Thread 类的CurrentThread 属性访问线程。
下面的程序演示了主线程的执行:
当上面的代码被编译和执行时,它会产生下列结果:
三、创建线程
线程是通过扩展 Thread 类创建的。扩展的 Thread 类调用 Start() 方法来开始子线程的执行。
下面的程序演示了这个概念:
当上面的代码被编译和执行时,它会产生下列结果:
四、利用多线程结束死循环例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace 多线程
{
class Program
{
static bool done=true;
static bool istrue = true;
static void Main(string[] args)
{
while (istrue)
{
Thread t = new Thread(Write);
t.Start();
string s = Console.ReadLine();
if (s == "p" || s =="P")
{
done = false;
}
}
}
public static void Write()
{
while (done)
{
Console.WriteLine("nice");
}
}
}
}