C#中的后台线程

基本概念就不再多说,后台线程和前台线程的主要区别就是后台线程不会防止进程的终止,这句话如何理解呢?下面用个例子来理解一下。      (阅读时请注意线程和进程的区别

先来看一下开启子线程的标准流程:

    public partial class Form1 : Form
    {
        private volatile bool threadStopped;  //多線程訪問的變量要用volatile修飾
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {

            Thread t = new Thread(MyThread);
            //t.IsBackground = true;      //設置是否為後台線程
            t.Name = "My Thread";
            t.Start();
            Thread.Sleep(100);
            MessageBox.Show("主線程輸出!");
            threadStopped = true;
        }

        private void MyThread()
        {
            MessageBox.Show("輔助線程開始!");
            while(!threadStopped)
            {
                Thread.Sleep(10);
            }
            MessageBox.Show("輔助線程結束!");
        }
}

在C#代码中使用new Thread( )新建的进程默认是前台线程,要想设置为后台线程,那么只需要将子线程的isBackGround属性设置为true即可。我们一般都会设置一个volatile变量来控制子线程是否结束,其实在这段代码中不管是否设置为后台线程,程序都可以正常执行,那么 t.IsBackground = true 什么时候有作用呢?

答案是这样的,很多时候一些子线程会被设计为死循环,也就是形如 while(true) 这样的,比如扫描线程,状态监测线程之类的,这些进程如果没有被设置为后台线程,那么进程就无法关闭,因为在没有强制终止的情况下,属于进程的所有前台线程都结束后,公共语言运行库才会结束该进程。

也就是说,如果没有设置为后台线程,且线程的委托方法是如下形式:

        private void MyThread()
        {
            MessageBox.Show("輔助線程開始!");
            while(true)
            {
                Thread.Sleep(10);
            }
            MessageBox.Show("輔助線程結束!");
        }

就会出现这样的情况:

我点击关闭窗口后,进程依然没有终止,调试按钮也表示还在运行:



关于volatile修饰符,也挺有意思,并不是只有在多线程时才使用,本意是即使程序代码没有对内存单元进行修改,其值也有可能发生变化。有可能是硬件修改,也可能是两个程序互相影响。

但它的本质还是告诉编译器,不要对该变量进行编译优化,所谓的编译优化就是指当编译器发现程序在几条语句中多次使用了某变量值,编译器可能不是每次都去内存中查找该变量,而是将该变量的值缓存到寄存器。这样就不能及时更新真正的值。

没有更多推荐了,返回首页