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         }
    }
原文地址:https://www.cnblogs.com/maxin991025-/p/6169379.html