• winform 进程,线程


    进程:
    一个程序就是一个进程,但是也有一个程序需要多个进程来支持的情况

    进程要使用的类是:Process
    它在命名空间:System.Diagnostics;

    静态方法Start();

    点击按钮打开一个程序,例如打开谷歌浏览器

    private void button1_Click(object sender, EventArgs e)
            {
                Process.Start("chrome");
            }

    也可以实例化对象,来调用Start()普通方法,但调用普通方法之前需要给
    StartInfo属性设置一个对象,来通知它要打开的是哪个进程

    //获取路径
            private void button2_Click(object sender, EventArgs e)
            {
                openFileDialog1.Filter = "应用程序|*.exe";
                DialogResult dr = openFileDialog1.ShowDialog();
                if(dr==DialogResult.OK)
                {
                    textBox1.Text = openFileDialog1.FileName;
                }
            }
            //打开文件
            private void button3_Click(object sender, EventArgs e)
            {
                Process p = new Process();
                ProcessStartInfo psi = new ProcessStartInfo(textBox1.Text);
                p.StartInfo = psi;
                p.Start();
            }

    线程:

    一个进程就像是一个公司,默认只有一个老板
    老板叫做 主线程
    主线程一旦让它去执行一段需要时间的代码,那么就会出现
    程序假死,失去控制

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

    解决办法:
    招一个员工帮老板干这个活

    开启线程:  使用Thread类

    一个进程就像是一个公司,默认只有一个老板
    老板叫做 主线程
    主线程一旦让它去执行一段需要时间的代码,那么就会出现
    程序假死,失去控制

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

    解决办法:
    招一个员工帮老板干这个活

    开启线程:
    线程基本使用:
    //创建一个线程对象,告诉它要执行的是哪一个方法
    Thread th = new Thread(aaa);

    //准备好了,开始执行,不是立即开始,CPU决定什么时候开始
    th.Start();
    ---------------------------------------------------------------
    需要跨线程访问对象:
    线程需要执行一个方法,而这个方法允许有一个参数,并且这个参数必须是object类型的

    程序默认不允许跨线程访问对象,因为监控开着
    需要关闭监控
    在构造函数的构造方法下面写上:
    Control.CheckForIllegalCrossThreadCalls = false;
    ---------------------------------------------------------------
    程序退出立刻关闭所有线程:
    线程默认开启为前台线程,程序必须将所有的前台线程执行完毕后才会真正退出程序

    解决办法:将线程变为后台线程
    //设置后台线程
    th.IsBackground = true;

     1 public partial class Form1 : Form
     2     {
     3         public Form1()
     4         {
     5             InitializeComponent();
     6             //程序默认不允许跨线程访问对象,因为监控开着,需要关闭监控,在构造函数的构造方法下面写上:
     7             Control.CheckForIllegalCrossThreadCalls = false;
     8         }
     9 
    10         private void button1_Click(object sender, EventArgs e)
    11         {
    12             //创建一个线程对象,告诉它要执行的是哪一个方法
    13             Thread th = new Thread(NewMethod);
    14             //设置后台线程
    15             th.IsBackground =true;
    16             //
    17             th.Start(sender);
    18             (sender as Button).Enabled = false;//开始后按钮不可用
    19         }
    20 
    21         private static void NewMethod(object obj)//提取的方法
    22         {
    23             for (int i = 0; i < 5; i++)
    24             {
    25                 Console.WriteLine(i);
    26                 Thread.Sleep(1000);//1秒循环一次
    27             }
    28             (obj as Button).Enabled = true;
    29         }
        }
  • 相关阅读:
    SSH 端口转发(本地转发与远程转发)
    树莓派修改分辨率
    再看ExpressionTree,Emit,反射创建对象性能对比
    Beyond Compare常用设置
    C#操作SqlServer MySql Oracle通用帮助类(默认支持数据库读写分离、查询结果实体映射ORM)
    Emit动态代理.NetCore迁移之旅
    红蓝对抗之邮件钓鱼攻击——用到了很多典型无文件攻击手段
    辗转相除法的证明
    下一个排列——这玩意考察的是单调栈
    Elkeid 规则引擎——数据向后传递是亮点,支持单事件规则和统计类规则;如果向后传递支持的话,理论上AB先后事件的关联分析可以做;自定义plugin类似udf
  • 原文地址:https://www.cnblogs.com/maxin991025-/p/6169379.html
Copyright © 2020-2023  润新知