C#-WinForm-进程、线程

进程:一个程序就是一个进程,也有可能一个程序需要多个进程来支持的情况,比如QQ

点击按钮打开记事本,静态方法

public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }
        //点击打开记事本
        private void button1_Click(object sender, EventArgs e)
        {
            Process.Start("notepad");
        }               
    }
点击打开记事本

引用新的命名空间:using System.Diagnostics;  新的类:Process;(李献策lxc)

==================================================

如何制作一个打开应用程序的程序?也可以实例化对象,来调用Start()普通方法

但调用普通方法之前,需要给StartInfo属性设置一个对象,来通知他要打开哪个进程(李献策lxc)

public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }
        //选择应用程序
        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "应用程序|*.exe";

            DialogResult dr = openFileDialog1.ShowDialog();
            if (dr == DialogResult.OK)
            {
                textBox1.Text = openFileDialog1.FileName;
            }
        }
        //打开程序
        private void button2_Click(object sender, EventArgs e)
        {
            Process p = new Process();//将Process实例化
            ProcessStartInfo psi = new ProcessStartInfo(textBox1.Text);//指定运行程序的路径名称
            p.StartInfo = psi;//接收路径
            p.Start();//运行程序
        }             
    }
运行选定的应用程序

 

=====================================================================

线程:

一个进程就像是一个公司,这个公司默认只有一个老板,老板叫做主线程,默认帮用户操作窗体,或者很快的其他操作

但如果执行长时间的操作,比如每隔一秒打印一个数字,此时主线程在执行循环,用户是无法操作窗体的

一个线程同一时间只能做一件事,程序一旦让他去执行一段需要时间的代码那么就会出现程序假死,失去控制

原因是:线程同一时间只能做一件事,而主线程是操作窗体控制的一旦被占用,那么窗体就没有人控制了(李献策lxc)

解决办法:

招一个员工帮老板干活

先把要执行的代码提取成一个方法,是一个完整的流程

点击按钮开始执行

 public Form3()
        {
            InitializeComponent();
        }
        //点击执行
        private void button1_Click(object sender, EventArgs e)
        {
            //创建一个线程对象,告诉他要执行的哪个方法
            Thread t = new Thread(aaa);
            //告诉他开始执行,不是立即开始,是cpu决定什么时候开始
            t.Start();
        }
        //要执行的程序代码,提取成方法
        private static void aaa()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(i);
                System.Threading.Thread.Sleep(1000);
            }
        }
    }
创建线程

可以同时创建多个线程(李献策lxc)

问题:每次点击一个线程都会执行一次代码,如果连续点击会重复执行相同代码,可以设计在线程执行时按钮不可用,执行完按钮变得可用

线程需要执行一个方法,而这个方法允许有一个参数,并且这个参数必须是object类型

 public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }
        //点击执行
        private void button1_Click(object sender, EventArgs e)
        {
            //创建一个线程对象,告诉他要执行的哪个方法
            Thread t = new Thread(aaa);
            //告诉他开始执行,不是立即开始,是cpu决定什么时候开始
            t.Start(sender);
            (sender as Button).Enabled = false;
        }
        //要执行的程序代码,提取成方法
        private static void aaa(object bbb)
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(i);
                System.Threading.Thread.Sleep(1000);
            }
            (bbb as Button).Enabled = true;
        }
    }
View Code

程序默认不允许跨线程访问对象,因为监控开着,需要关闭监控

创建的线程是无法访问主线程的内容、控件的,需要结构函数中改变属性值即可(李献策lxc)

线程默认开启为前台线程,程序必须将所有的前台线程执行完毕后才会真正退出程序

解决办法:将线程变为后台线程,主窗体一关,后台线程全部关闭(李献策lxc)

原文地址:https://www.cnblogs.com/qq450867541/p/6180418.html