進程:一個程序就是一個進程,也有可能一個程序需要多個進程來支持的情況,比如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; } }
程序默認不允許跨線程訪問對象,因為監控開着,需要關閉監控
創建的線程是無法訪問主線程的內容、控件的,需要結構函數中改變屬性值即可(李獻策lxc)
線程默認開啟為前台線程,程序必須將所有的前台線程執行完畢后才會真正退出程序
解決辦法:將線程變為后台線程,主窗體一關,后台線程全部關閉(李獻策lxc)