------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
进程与线程:
简单的说:一个程序就是一个进程,一个进程至少包含一个线程。
同一进程中的多个线程之间可以“并发”执行。在几个线程之间切换运行,当切换到另一线程时,由本线程的寄存器保存当前的运行状态,以便从另一线程运行完成后再从上次的状态处开始继续运行。
线程启动:通过委托调用该方法。(委托的好处)(线程启动时,调用传过来的委托,委托就会执行相应的方法,实现线程执行方法)。创建线程前要先创建线程要执行的方法。
线程重入问题:由于CPU处理多线程时是在线程间切换执行,所以当在编写代码时特别是连续执行同一段代码时,使得数据运算混乱两段代码的值出现了混淆,不过两个线程是独立运行的。
产生一个线程的4步骤:
1)编写产生线程所要执行的方法
2)引用System.Threading命名空间
3)实例化Thread类,并转入一个指向线程所要运行方法的委托。(这时候这个线程已经产生,但是还没有运行)
4)调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定。
注意:创建一个线程后,运行程序,当关闭界面后,如果创建的是前台线程,那么线程将继续运行,因为线程是调用的系统线程,当关闭界面后,只是关闭了UI线程,创建的前台线程仍在运行。(是因为创建的是前台线程还是后台线程的事)
前台线程:只有所有的前台线程都关闭才能完成程序关闭。
后台线程:只要所有的前台线程结束,后台线程自动结束。
设置后台线程: thread1.IsBackground=true。
线程执行带参数的方法:
//............带一个参数的方法.......................
void ShowTxtName(object name) //线程执行带参数的方法,线程的委托要求方法参数必须为Object类型
{
if (name != null)
MessageBox.Show("name=" + name.ToString());
else
MessageBox.Show("null");
}
//............执行带参数的方法的线程.................
private void btnThreadWithPara_Click(object sender, EventArgs e)
{
Thread thread = new Thread(ShowTxtName); //调用带参数的方法
thread.IsBackground = true;
thread.Start(txtName.Text); //传递带参数的方法的参数值
}
//............带多个参数的方法......................
void ShowTxtName2(object li)
{
List<string> list= li as List<string>;
if(list!=null)
{
foreach (string s in list)
{
MessageBox.Show(s);
}
}
}
//............执行带多个参数的方法..................
private void btnManyPara_Click(object sender, EventArgs e)
{
Thread thread = new Thread(ShowTxtName2); //调用带参数的方法
thread.IsBackground = true;
thread.Start(new List<string>() { "刘德华","王力宏","孙燕姿"});
}
自己定义线程:
public class MyThread
{
//........执行不带参数的方法........
ThreadStart ts; //委托
public MyThread(ThreadStart ts) //要求用户在new的时候传入方法委托
{
this.ts = ts; //将委托赋给全局变量
}
public void Start()
{ //如果new Thread(Object o)即带参数的线程,但是Start()无参。
If(ts!=null)
ts(); //调用委托,执行委托里的方法
else
pts(null)
}
//........执行带参数的方法........
ParameterizedThreadStart pts;//带参数的委托
public MyThread(ParameterizedThreadStart pts)
{
this.pts = pts; //将委托赋给全局变量
}
public void Start(object o) // 必须为object类型的参数
{
pts(o); //调用委托,执行委托方法
}
}