一、1. 线程是什么,为什么使用线程不赘述
2. 使用线程要引入命名空间 System.Threading;
3. 线程函数通过委托(ThreadStart,ParameterizedThreadStart)传递,可以不带参数,也可以带object参数(只能有一个参数),可以用一个类或结构体封装参数。
4. 新开一个线程,线程函数通过委托传递,方式很多。如下
private void button1_Click(objectsender, EventArgs e)
{
//创建线程t1,t2,t3,t4,方式各异
Thread t1 = new Thread(Run1);
Thread t2 = new Thread(new ThreadStart(Run1));
Thread t3 = new Thread((ThreadStart)Run1);
Thread t4 = new Thread(new ParameterizedThreadStart(Run2)); //带参的函数,ParameterizedThreadStart是委托,参数类型object,故write2参数必须是object类型
t1.Start(); //运行该线程,执行t1的Run1函数
t2.Start();
t3.Start();
t4.Start(200); //t4执行Run2函数,传参200
}
private void Run1()
{
lock (locker)
{
money += 100;
}
Thread.Sleep(500);
}
private void Run2(objectmny)
{
lock (locker)
{
money += int.Parse(mny.ToString());
}
Thread.Sleep(500);
MessageBox.Show(money.ToString());
}
5.线程常用方法
5.1 创建并启动一个线程,Run作为要执行的方法,线程状态变为Running
Thread t1 = new Thread(newThreadStart(Run));
t1.Start();
5.2 线程挂起一段时间(3秒),线程状态改为WaitSleepJoin,然后继续执行(状态Running)。即线程暂停3秒
t1.Sleep(3*1000);
5.3 终止线程,在调用此方法的线程t1引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程,线程状态变为stopped。Abort之前最好判断下线程当前状态,用到IsAlive属性
if (t1.IsAlive) //如果此线程已经开始但尚未正常终止或中止,则为true,否则为 false。
{
t1.Abort(); //t1.Abort(Object),带参数的可以提供一个异常信息
}
//如果Abort 一个尚未启动的线程,该线程将中止Start 调用。如果Abort 被阻止或正在休眠的线程,该线程中断然后终止。
5.4 设置优先级。分为5个优先级:Highest,AboveNormal,Normal,BelowNormal,Lowest,优先级从高到低,但是操作系统不保证遵循这个优先级
t1.Priority =ThreadPriority.Highest; //先设置优先级,再start