进程和线程
进程:
一个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(); } } } }