操作系统以进程(Process)的方式运行应用程序,进程不但包括应用程序的指 令流,也包括运行程序所需的内存、寄存器等资源。在一个进程中我们可以创建多个个线程(Threading)来实现多个任务“同时”进行的目标。
注:在单核 CPU 的计算机操 作系统将自动以“时间片轮转”的方式交替执行线程指令,多核心 CPU,使得线程能够真正的实现同步执行。
在 C#中,线程由 System.Threading 命名空间中的 Thread 类实现。声明线程的语法与如下:
Thread workThread = new Thread(entryPoint);
其中 entryPoint 代表一个入口方法,线程的具体代码放在入口方法中,系统从入口方 法的第一句代码开始执行线程。
Thread 类的部分属性和方法
一个简单的例子,说明如何创建,开启,暂停,恢复一个简单的线程
//创建互斥体
//Mutex fileMutex = new Mutex(false, "MutexForTimeRecordFile");
static AutoResetEvent fileMutex = new AutoResetEvent(false);
private static bool State = true;
private void EntryPoint()
{
int loop = 0;
int sect = 0;
float[] x = new float[31];
float[] y = new float[31];
Graphics g = this.CreateGraphics();
//绘制图形 10000 遍,每隔 200 毫秒绘制一遍
while (loop < 10000)
{
if (!State)
{
fileMutex.WaitOne();
}
sect = (sect + 1) % 25 + 1;
//绘制图形
for (int i = 0; i < sect; i++)
{
x[i] = (float)(150 * Math.Cos(i * 2 * Math.PI / sect) + 550);
y[i] = (float)(150 * Math.Sin(i * 2 * Math.PI / sect) + 150);
}
for (int m = 0; m < sect - 1; m++)
{
for (int n = 0; n < sect; n++)
{
g.DrawLine(Pens.Blue, x[m], y[m], x[n], y[n]);
}
}
//线程暂停 200 毫秒
Thread.Sleep(200);
//清除图形,以便重新绘制
g.Clear(this.BackColor);
loop++;
}
}
//声明工作线程
Thread drawGraphThread;
private void button1_Click(object sender, EventArgs e)
{
drawGraphThread = new Thread(EntryPoint);
//启动线程
drawGraphThread.Start();
//设置按钮的有效性
button1.Enabled = false;
button2.Enabled = true;
button3.Enabled = false;
button4.Enabled = true;
}
private void button2_Click(object sender, EventArgs e)
{
//暂停线程
// drawGraphThread.Suspend();
State = false;
//设置按钮的有效性
button1.Enabled = false;
button3.Enabled = true;
button4.Enabled = false;
}
private void button3_Click(object sender, EventArgs e)
{
//恢复线程
// drawGraphThread.Resume();
State = true;
fileMutex.Set();
//设置按钮的有效性
button1.Enabled = false;
button2.Enabled = true;
button4.Enabled = true;
}
private void button4_Click(object sender, EventArgs e)
{
//中止线程
drawGraphThread.Abort();
//设置按钮的有效性
button1.Enabled = true;
button2.Enabled = false;
button3.Enabled = false;
button4.Enabled = false;
}
在.NET2.0 中,Suspend()函数和 Resume 函数已经过时.