一个程序运行起来,都会生成一个进程。每个进程都有一个默认的进程。这个进程叫做主线程,也叫UI线程。
主线程之外,另外的线程都称为子线程。任何在程序里new的线程,都是子线程。
任何一个线程都会默认为前台线程。可以主动设置默认线程。//th.IsBackground = true;
后台线程与前台线程的区别:一个进程只有在所有的前台线程都结束,整个进程才会关闭。如果前台线程都结束了,假如后台线 程还在执行,那么所有的后台线程会被立刻结束。
创建一个线程,可以不带参数,也可以带参数。带参数时,是在.start()的括号里面调用的。
线程在用完了以后,不会立即消失,而是会存到线程池中。
ThreadPool线程池中有两个重载的静态方法可以直接启动工作者线程:
- ThreadPool.QueueUserWorkItem(waitCallback);
- ThreadPool.QueueUserWorkItem(waitCallback,Object);
先把WaitCallback委托指向一个带有Object参数的无返回值方法,再使用ThreadPool.QueueUserWorkItem(WaitCallback)就可以一步启动此方法,此时异步方法的参数被视为null
能够暂时将跨线程问题跳过:
Control.CheckForIllegalCrossThreadCalls = false;
线程的常用成员:
1.Thread.CurrentThread;//获取当前的工作进程。
2.每个线程都有一个唯一的id,这个id是有操作系统维护的,id的作用就是为了操作系统来调度这些线程
3.Thread.Sleep(3000);//暂停,让当前线程挂起,括号内的单位是毫秒,3000为3秒
4.Thread.Abort();//终止线程
线程重入:两个线程同时进行,一些共同的数据可能窜用。
防止线程重入:加锁。选中代码,然后右键,添加外侧代码,找到lock。
锁要生成为全局的,用this。lock(this),一般不会出错
使用多线程:
using System.Threading;//引用进程
Thread th = new Thread(Loop);//创建一个子线程。//Thread()的括号内是一个委托
th.IsBackground = true;//主动设置默认线程
th.Start();//运行
th.start(233)//带参数,传参
//将当前进程的id输出搭配textBox1中
this.textBox1.Text = Thread.CurrentThread.ManagedThreadId.ToString();
Thread.Sleep(3000);//暂停,暂时挂起,括号内的单位是毫秒,3000为3秒
MessageBox.Show("三秒完了");//输出一个提示框
private void Loop()
{
for (int i = 0; i < 999999999; i++)
{
}
MessageBox.Show("做完了");
}
private static void GetNumber(object num)//带参数的委托
{
}
private static void GetNumber2(object p)//带参数的委托,参数类型不为object的
{
Person p = p as person;
}