进程和线程

进程:

一个winfrom程序就是一个进程,一个qq就是一个进程,浏览器等等,一个进程里又包含很多线程

namespace test {
    class Processtest {
        static void Main() {
            //获得计算机中所有正在运行的进程
            Process[] pros = Process.GetProcesses();
            foreach (var item in pros) {
                Console.WriteLine(item);
            }

            //通过进程打开一些应用程序
            //Process.Start("calc");
            //Process.Start("mspaint");
            //Process.Start("notepad");
            //Process.Start("iexplore","http://www.baidu.com");

            //通过进程打开指定的文件
            //第一:创建进程对象
            Process p = new Process();
            ProcessStartInfo psi = new ProcessStartInfo(@"C:\Users\Administrator\Desktop\背包.docx");
            p.StartInfo = psi;
            p.Start();
            //每个进程都是由多个线程组成
        }
    }
}

 

前台线程和后台线程

前台线程:只有所有的前台线程都关闭才能完成程序关闭

后台线程:只要所有的前台线程都结束,后台线程自动结束

默认情况下创建的线程都为前台线程

namespace Controlstudy {
    public partial class ThreadFrm : Form {
        public ThreadFrm() {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e) {
            //Test();
            //创建一个线程去执行这个方法
            Thread th = new Thread(Test);
            //标记这个线程准备就绪了,可以随时被执行,cpu决定何时执行
            th.Start();
        }
        //主线程用于窗体服务,展示,拖拽,按钮点击等等
        //主线程都去干这个事了,窗体假死状态
        private void Test() {
            for (int i = 0; i < 10000; i++) {
                Console.WriteLine(i);
            }
        }
    }
}

  将线程设置为后台线程,前台线程一关,后台线程自动关闭

namespace Controlstudy {
    public partial class ThreadFrm : Form {
        public ThreadFrm() {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e) {
            //Test();
            //创建一个线程去执行这个方法
            Thread th = new Thread(Test);
            //将线程设置为后台线程,前台线程一关,后台线程自动关闭
            th.IsBackground = true;
            //标记这个线程准备就绪了,可以随时被执行,cpu决定何时执行
            th.Start();
        }
        //主线程用于窗体服务,展示,拖拽,按钮点击等等
        //主线程都去干这个事了,窗体假死状态
        private void Test() {
            for (int i = 0; i < 10000; i++) {
                Console.WriteLine(i);
            }
        }
    }
}

跨线程访问报错实例

namespace Controlstudy {
    public partial class ThreadFrm : Form {
        public ThreadFrm() {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e) {
            //Test();
            //创建一个线程去执行这个方法
            Thread th = new Thread(Test2);
            //将线程设置为后台线程,前台线程一关,后台线程自动关闭
            th.IsBackground = true;
            //标记这个线程准备就绪了,可以随时被执行,cpu决定何时执行
            th.Start();
        }
        //主线程用于窗体服务,控件渲染等,展示,拖拽,按钮点击等等
        //主线程都去干这个事了,窗体假死状态
        private void Test() {
            for (int i = 0; i < 10000; i++) {
                Console.WriteLine(i);
            }
        }
        //跨线程访问报错
        private void Test2() {
            for (int i = 0; i < 10000; i++) {
                //textbox1为主线程创建的
                textBox1.Text = i.ToString();
            }
        }
    }
}

  手动关闭线程

namespace Controlstudy {
    public partial class ThreadFrm : Form {
        public ThreadFrm() {
            InitializeComponent();
        }
        Thread th;
        private void button1_Click(object sender, EventArgs e) {
            //Test();
            //创建一个线程去执行这个方法
            th = new Thread(Test2);
            //将线程设置为后台线程,前台线程一关,后台线程自动关闭
            th.IsBackground = true;
            //标记这个线程准备就绪了,可以随时被执行,cpu决定何时执行
            th.Start();
        }
        //主线程用于窗体服务,控件渲染等,展示,拖拽,按钮点击等等
        //主线程都去干这个事了,窗体假死状态
        private void Test() {
            for (int i = 0; i < 10000; i++) {
                Console.WriteLine(i);
            }
        }
        //跨线程访问报错
        private void Test2() {
            for (int i = 0; i < 10000; i++) {
                //textbox1为主线程创建的
                textBox1.Text = i.ToString();
            }
        }

        private void ThreadFrm_Load(object sender, EventArgs e) {
            //取消跨线程访问检查
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void ThreadFrm_FormClosing(object sender, FormClosingEventArgs e) {
            //当点击关闭窗体的时候,判断新线程是否为null,如果不为null,则手动关闭掉
            if (th != null) {
                th.Abort();
            }
        }
    }
}

 

posted on 2017-01-03 17:06  防空洞123  阅读(155)  评论(0编辑  收藏  举报

导航