黑马程序员 多线程

来源:互联网 发布:仿淘宝app首页 编辑:程序博客网 时间:2024/06/08 11:32

------- 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培训、期待与您交流! -------

原创粉丝点击