.net学习之多线程的学习

来源:互联网 发布:移动手机信号测试软件 编辑:程序博客网 时间:2024/06/16 06:34

在c#中要使用多线程需要引入 system.Threading命名空间

一个进程中可有若干个线程,从而可以在“同一时间”内可以几件事情一起做--即并发执行,其实是时间片的轮转。

单线程有很多时候无法满足程序的功能,例如要进行一个很长时间的计算,在计算的过程中UI进程会“卡死”,直到计算完毕

才能恢复正常。

实例代码如下:

        private void button1_Click(object sender, EventArgs e)
        {
            count();


        }
        private void count()
        {
            for (int i = 0; i < 1000000000;i++ )
            {


            }
            MessageBox.Show("循环完毕");
        }


        private void button2_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(count);
            thread.Start();
        }

线程分为前台线程和后台线程,如果不做特殊的书名,c#默认产生前台进程,这样当主界面关闭后

前台线程依然在进行(c#产生的线程是系统线程),如果要设为后台线程只需要设置设置一个Thread的

IsBackgroud属性为true即可。


线程重入问题

代码如下:

FormLoad的时候设置TextBox.CheckForIllegalCrossThreadCalls = false,才能在其他线程使用UI进程中的textbox

        void ChangeText()
        {
            int i=Convert.ToInt32(textBox.Text);
            for (int j = 0; i < 10000;j++ )
            {
                i++;
                textBox.Text = i.ToString();
                Console.WriteLine("线程名: "+Thread.CurrentThread.Name+"    i的值="+i.ToString());
            }
        }


        private void button3_Click(object sender, EventArgs e)
        {
            textBox.Text = "0";
            Thread thread1 = new Thread(ChangeText);
            thread1.Name = "FirstThread";
            thread1.IsBackground = true;
            thread1.Start();


            Thread thread2 = new Thread(ChangeText);
            thread2.Name = "SecondThread";
            thread2.IsBackground = true;
            thread2.Start();
        }


结果如下:

       、

       、

       、

线程名: SecondThread    i的值=9991
线程名: FirstThread    i的值=9994
线程名: SecondThread    i的值=9992
线程名: FirstThread    i的值=9995
线程名: SecondThread    i的值=9993
线程名: FirstThread    i的值=9996
线程名: SecondThread    i的值=9994
线程名: FirstThread    i的值=9997
线程名: SecondThread    i的值=9995
线程名: FirstThread    i的值=9998
线程名: SecondThread    i的值=9996
线程名: SecondThread    i的值=9997
线程名: FirstThread    i的值=9999
线程名: FirstThread    i的值=10000
线程名: SecondThread    i的值=9998
线程名: SecondThread    i的值=9999
线程名: SecondThread    i的值=10000

线程间跳转的时候取到i的值,但未自增就条转到其他线程造成的现象。


带参数的线程

当创建线程的时候构造一个带有参数的线程,

在线程Start的时候传入参数即可。

Thread.Start(object o)参数为Object所以可以传入任何类型的参数。


结束进程的方法thread.abort();

线程暂停一段时间thread.sleep(time);


学习多线程是从传智播客的网站上下载的视频教程,传智播客作为一个培训公司,免费放出了很多java 。net方面的视频,想要自学的朋友可以去下载看看,感觉

他们的教程很是不错,自学的视频基本都是从那里下载的,这里也算是给他们做下广告表示我的谢意。



原创粉丝点击