• 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)

  • 相关阅读:
    HTML转PDF
    观察者模式分析
    异常解决方案记录
    复杂结构数据提交
    在Spring Controller中将数据缓存到session
    Eclipse
    redis数据类型-散列类型
    redis数据类型-字符串类型
    redis键操作
    redis性能优化
  • 原文地址:https://www.cnblogs.com/qq450867541/p/6180418.html
Copyright © 2020-2023  润新知