首页 > 代码库 > 进程和线程

进程和线程

进程:

一个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();            }        }    }}

 

进程和线程