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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM