------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
——进程
可以理解为现在正在运行的程序
进程与线程的关系:进程包含线程
设一个进程要完成两个任务
任务1:a1-b1-c1
任务2:a2-b2-c2
同步执行的过程:a1-b1-c1-a2-b2-c2
异步执行的过程:a1-b1-c1
a2-b2-c2 效率比同步执行高一倍
什么时候用线程:当多个线程所需要的资源比较均匀这时完全可以让他们异步并发执行
1)一个进程中,至少有一个线程
2)同一个进程中的多个线程之间可以“并发”执行
a) 线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针,程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数
b) 多线程是指程序中包含的多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序创建多个并行执行的线程来完成各自的任务
——.net中如何实现多线程
1) 线程肯定也是要执行一段代码的,所以要产生一个线程,必须先为该线程写一个方法,这个方法中噢乖的代码就是该线程运行所要执行的代码(找个人来做一件事)
2) 线程启动时,通过委托调用该方法(委托的好处)
(线程启动时,调用传过来的委托,委托就会执行相应的方法,实现线程执行方法)
——多线程
为什么要用多线程
1)节约时间:让计算机同时做多件事情
2)提高效率:同时不会使主界面出现无响应的情况
3)使用资源:计算机cpu大部分时间处于空闲状态
单线程带来的问题:(售货员在作别的事情,客户就没人招待了)
产生一个线程的4个步骤:
1. 编写产生线程所要执行的方法
2. 引用System.Threading命名空间
3. 实例化Thread类,并传入一个指向线程所要运行方法委托(这个时候这个线程已经产生但是还没有运行)
4. 调用Thread实力的Start方法,标记该线程可以被CPU执行,但具体执行时间由CPU决定
如:
前提:1.已经引用了System.Threading
2.构造了一个方法changeTxt)
Thread thread = newThread(changeTxt);
thread1.Start();
——单线程的缺点与多线程的优点
单线程缺点:ui卡死问题
窗体还在执行线程的过程中不能拖拽窗体移动
多线程优点:能解决ui卡死问题
窗体还在执行线程的过程中仍然能拖拽窗体移动
过程: 1)创建线程对象 传入要线程执行的方法
2)将线程设置为后台线程
3)启动线程 执行方法
如:
//创建线程对象 传入要线程执行的方法
Thread Thread = new Thread(CountTime);
//将线程设置为后台线程
Thread.IsBackground = true;
//启动线程 执行方法
Thread.Start();
——前台线程和后台线程
前台线程:只有所有的前台线程都关闭才能完成程序关闭
后台线程:只要所有的前台线程结束,后台线程自动结束
将前台线程设置为后台线程的格式:线程名.isBackGroud=true;
如:
Thread thread1 = newThread(changeTxt);
thread1.Name = "t1";
thread1.IsBackground = true; //将前台线程设置成后台线程
thread1.Start();
——多线程的重入问题
1. 在共享同一个代码区时,因为线程的重入,其中一个线程可能还没有执行完毕,权限又被交给第二个线程执行
2. 虽然共享同一块代码区,但是他们的执行是相对独立的
——多线程实现带参数的方法
过程:
1. 构造一个方法,但是方法中必须接收参数
如:
void ShowTextName(object name)//没有传参,name默认为null
{
if (name != null)
{
MessageBox.Show("name=" + name.ToString());
}
else
{
MessageBox.Show("null");
}
}
1) 接受参数的类型必须为object
2) 没有传参时,name默认为null
2.创建一个线程,启动一个线程,并传入参数
如:
Thread thread = newThread(ShowTextName);E
thread.IsBackground = true;
thread.Start(textName.Text);
——线程实现带多个参数的方法
过程:
1. 构造一个方法,方法中设置传入参数的类型为object
2. 在方法总构造一个数组或者list类型
如:
void ShowTextName2(object li)
{
List<string> list = li asList<string>;
if (list != null)
{
foreach (string s in list)
{
MessageBox.Show(s);
}
}
}
3. 创建一个线程,启动一个线程,并在线程中传入多个参数
如:
Thread T = newThread(ShowTextName2);
T.IsBackground = true;
T.Start(newList<string>() { "周杰伦","滨崎步","李孝利"})
——Thead类
启动线程:
-Thead thread1=newThread(new ThreadStart(count));
其中Count是将要被新线程执行的函数
杀死线程
-1.首先判断线程是否还活着 :通过IsAlive属性
-2然后调用Abort方法来杀死此进程:thread1.Abort();
优先级:
-利用Thread类中的ThreadPriority属性来设置优先级,但不能保证操作系统会接受该优先级。
-优先级分为五种:
-Normal,AboveNormal,BelowNormal,Highest,Lowest。
挂起线程:
-Thread类的Suspend方法来挂起线程,调用Resume才能恢复线程以继续执行,已经挂起的线程不会起作用
恢复线程:
-用Resume方法来恢复挂起的线程