------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
一、 进程与线程
l 进程:一个运行的程序就是一个进程,进程包括运行中的程序和程序需要用到的内存和系统资源;
一个进程至少有一个线程,一个进程中多个线程可以并发执行
l 线程:程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码去是共享的,即不同的线程可以执行同样的函数。
l 多线程:指程序中包含多个执行流,即在一个程序中可以运行多个不同的线程来执行不同的任务。
l 线程的“并发”:CPU某一时刻只能执行一个线程,但是CPU切换执行线程的时间太短,看起来所有线程在同时执行;
二、 .Net中如何实现多线程?
l 线程肯定要执行一段代码,所以要产生一个线程,必须为这个线程写一个方法,方法中的代码就是该线程运行时执行的代码。
l 线程启动时,通过委托调用方法。(委托的好处)
线程启动时,调用传过来的委托的实例,委托就会调用相应的方法,实现线程执行方法。
三、 .Net中产生一个线程的4步骤:
1. 编写该线程要执行的方法;
2. 引用System.Threading命名空间;
3. 实例化Thread类,并传入一个指向线程要执行方法的委托(这时线程已经产生,但是还没有运行);
4. 调用Thread实例的Start方法,标记该线程可以被CPU执行了,但是具体执行时间由CPU决定。
四、 前台线程和后台线程
前台线程:只有当所有的前台线程都关闭后,程序才真正关闭;
后台线程:只要所有的前台线程都关闭了,后台线程将自动关闭。
新建线程默认是前台线程。
设置线程为后台线程:设置线程实例的属性IsBackground=true。
五、 聊天室程序和Web服务器会用到多线程。
六、 为什么要用多线程
1.可以让计算机“同时”做多件事情,节约时间;
2.后台运行另一段代码,前台界面也不会造成卡顿,提高执行效率;
七、 单线程带来的问题
单线程执行代码时,程序不能再响应其他操作,如果这段代码比较耗时,那么程序界面就会无响应,只能等待。
八、 创建线程的实例
void CountTime()
{
DateTime begin = DateTime.Now;
for (int i = 0; i < 999999999; i++){} //空循环9亿次
TimeSpan ts = DateTime.Now.Subtract(begin);
MessageBox.Show("循环完毕。用时:" + ts.TotalMilliseconds.ToString());
}
private void btnMulThread_Click(object sender, EventArgs e)
{
//创建一个线程,传入该线程要执行的方法
Thread thread = new Thread(CountTime);
//将线程设置为后台线程(当所有的前台线程结束后,后台线程会自动退出)
thread.IsBackground = true;
//启动线程,执行方法
thread.Start();
}
Thread类的构造函数:public Thread(ThreadStart start)
ThreadStart 是指向一个无参方法的委托。
九、 线程的方法重入问题
所谓方法重入,是一个有关多线程编程的概念。程序中多个线程同时运行时,就可能发生同一个方法被多个线程调用的情况。当这个方法中存在一些非线程安全的代码时,方法注入就会导致数据不一致的情况,这是非常严重的BUG。
运行异常:“线程间操作无效: 从不是创建控件“txtNum”的线程访问它。”
分析: txtNum是UI线程创建的,其他线程默认不能再访问它。如果想在其他线程中访问该控件,设置“TextBox.CheckForIllegalCrossThreadCalls = false ”。
十、 Thread类的重要成员
Start()启动线程;
Abort()终止线程;
Thread.Sleep(1),静态方法,使当前线程停止运行一段时间;
Name,线程名;
Thread.CurrentThread:静态成员,获得当前线程的引用;
十一、 线程执行带参数的方法
1.执行带单个参数的方法
委托ParameterizedThreadStart指向带参数的方法,且参数类型为object。
代码示例:
//线程执行带单个参数的方法 void ShowName(object name) { if (name != null) { MessageBox.Show("name=" + name.ToString()); } else { MessageBox.Show("name=null"); } } //-----------------线程执行带单个参数的方法----------------- private void btnThreadWithOneParam_Click(object sender, EventArgs e) { Thread thread = new Thread(ShowName); thread.IsBackground = true; thread.Start(txtName.Text); }
2. 线程执行带多个参数的方法
委托ParameterizedThreadStart指向方法的参数为object类型,因为object是所有类型的父类,所以可以通过传入数组或者泛型,来实现线程执行带多个参数的方法。
//带多个参数的方法
void ShowName2(object li)
{
List<string> list = li as List<string>;
if (list != null)
{
foreach (string s in list)
{
MessageBox.Show(s);
}
}
}
//-----------------线程执行带多个参数的方法-----------------
private void btnThreadWithMultiParams_Click(object sender, EventArgs e)
{
Thread thread = new Thread(ShowName2);
//将线程设为后台线程(当所有的前台线程都结束后,后台线程自动结束)
thread.IsBackground = true;
thread.Start(new List<string> { "张馨予", "李连杰", "林冲" });
}
------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------