“----------ASP.Net+Android+IOS开发、Net培训、期待与您交流!----------”
/*
为什么要用多线程
1.让计算机“同时”做多件事情,节约时间
2.后台运行程序,提高程序的运行效率,也不会使主界面出现无法响应的情况
3.多线程可以让一个程序“同时”处理多个事情
4.计算机CPU大部分时间处于空闲状态,浪费了CPU的资源
进程与线程
1.一个进程至少有一个线程
2.同一个进程中的多个线程可以“并发”执行
3.线程是程序中的一个执行流,每个线程都有自己专有的寄存器(栈指针,程序计数器等),但代码区是共享的,即不同的线程可以执行相同的函数.
4.多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序创建多个并行执行的线程来完成各自的任务
如何实现多线程
1.线程肯定是要执行一段代码的,所以要产生一个线程,必须先为该线程写一个方法,这个方法中的代码就是该线程运行所要执行的代码。(这个人来做一件事情)
2.线程启动时,通过委托调用该方法(调用传过来的委托,委托就会执行相应的方法,实现线程执行方法).
产生一个线程的步骤:
1.编写产生线程所要执行的方法
2.实例化Thread类,并传入一个指向线程所要运行方法的委托(这时候线程已经产生,但是还没有运行)
3.调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定
前台线程和后台线程
1.前台线程:只有所有的前台线程都关闭才能完成程序关闭(默认)。
2.后台线程:只要所有的前台线程结束,后台线程自动结束(设置属性IsBackground=ture)
*/
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
TextBox.CheckForIllegalCrossThreadCalls = false;//线程的方法中不能给UI线程中的TextBox赋值的,只有加上这句话才可以的
}
private void CountTime() {
for (int i = 0; i < 999999999; i++)
{
}
MessageBox.Show("循环完毕~");
}
private void ChangeTxt() {
for (int i = 0; i < 1000;i++ ) {
int a = int.Parse(txtNum.Text);
Console.WriteLine(Thread.CurrentThread.Name+",a="+a+",i="+i);
a++;
this.txtNum.Text = a.ToString();//不是UI线程中的方法,不能给TextBox赋值,需加上TextBox.CheckForIllegalCrossThreadCalls = false;
}
}
private void ShowName(object name) {
MessageBox.Show("name="+name);
}
private void ShowName2(object li)
{
List<string> list = li as List<string>;
foreach(string name in list){
MessageBox.Show("name=" + name);
}
}
//单线程的缺点(单击按钮后无法再拖动窗体,只有等循环完毕后才能拖动窗体)
private void btnSingelThread_Click(object sender, EventArgs e)
{
CountTime();
//ChangeTxt(); //UI线程自己访问可以给txtNum控件赋值
}
//使用线程来解决单线程的缺点(UI卡死问题)
private void btnMutiThread_Click(object sender, EventArgs e)
{
//声明一个委托(无参无返回值)
ThreadStart ts = new ThreadStart(CountTime);
Thread threadFirst = new Thread(ts); //上面两行等同于Thread threadFirst = new Thread(CountTime);
//前台线程:没有对该对象设置IsBackgroud属性
//后台线程,当所有前台线程结束后,后台线程会自动退出(单击关闭按钮,如果不加这句话,关闭窗体后过一会还会弹出对话框)
//threadFirst.IsBackground = true;
threadFirst.Start();
}
//多线程方法重入问题(txtNum.Text!=2000)
private void btnProblem_Click(object sender, EventArgs e)
{
//.net中的线程是系统线程???
Thread thread1 = new Thread(ChangeTxt);
thread1.Name = "t1";
thread1.IsBackground = true;
thread1.Start();
Thread thread2 = new Thread(ChangeTxt);
thread2.Name = "t2";
thread2.IsBackground = true;
thread2.Start();
}
//线程执行带参数的方法(方法的参数需是object)
private void btnThreadWithPara_Click(object sender, EventArgs e)
{
ParameterizedThreadStart pts = new ParameterizedThreadStart(ShowName);//方法的参数需是Object
Thread thread = new Thread(pts);
thread.IsBackground = true;//后台线程
thread.Start(txtName.Text); //传递参数
}
//线程执行带多个参数的方法
private void btnThreadWithManyPram_Click(object sender, EventArgs e)
{
ParameterizedThreadStart pts = new ParameterizedThreadStart(ShowName2);
Thread thread = new Thread(pts);
thread.IsBackground = true;//后台线程
thread.Start(new List<string>() {"刘德华","黎明","张学友","郭富城" }); //传递参数
}
}