A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 安玉波 中级黑马   /  2013-3-7 00:08  /  1604 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一、进程
        .一个程序就是一个进程,一个进程至少包含一个线程(主线程)。同一个进程中的多个线程之间可以“并发”执行。
二、线程
        线程的用途:CPU通过线程执行代码块中的代码,即用来执行代码块中的代码。
        线程是程序中的一个执行流,每个线程都有自己的专有寄存器,但代码区是共享的,即不同的线程可以执行同样的函数。
        多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序        创建多个并行执行的线程来完成各自的任务。
        多个线程的“并发”执行指的是:多个线程之间不断的切换执行。
        要产生一个线程必须 为该线程写一个方法,这个方法中的代码就是该线程的运行所要执行的代码(这个方法就好比你要这个线程做的事情),线程在启动时通过委托调用该方法(线程启动时,调用传过来的委托,委托就会执行相应的方法。实现线程执行方法)。
        单线程带来的问题:
        例如:新建个窗体应用程序,在窗体上放一个button按钮,在button按钮的Click事件中写如下代码:
       
        private void btnlogin_Click(object sender, EventArgs e)
        {            
            for (int i = 0; i < 999999999; i++)
            {
               
            }
            MessageBox.Show("循环完毕!");
        }
        然后再启动调试,弹出个窗体这时候你可以用鼠标移动窗体,但是当你点击button按钮时,窗体就不能移动了。这是因为一个程序就是一个进程,一个进程默认只有一个线程(主线程),在你点击按钮时当前的主线程去做循环去了,不会去相应用户的操作。(就好像收银员去接待客人去了,收银台就没有人收银了一样)
        解决办法就是使用多线程,代码如下:
       
        //使用多线程解决UI卡死问题
        private void btnlogin_Click(object sender, EventArgs e)
        {
            //创建线程对象  传入 让线程执行的方法
            Thread threadfirst = new Thread(CountTime);
            //启动线程执行方法
            threadfirst.Start();

        }
        /// <summary>
        /// 循环技术方法
        /// </summary>
        private static void CountTime()
        {
            for (int i = 0; i < 999999999; i++)
            {

            }
            MessageBox.Show("循环完毕!");
        }
启动程序后点击button按钮就不会出现UI卡死问题,因为在点按钮时,主线程创建了一个线程把Click事件要处理的代码交给这个新线程去解决,UI线程去相应用户的操作。(就好像收银员把接待客人的事情交给了销售员,而收银员只收银一样)

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马