亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

淺解關于C#多線程的介紹

2020-01-24 03:28:08
字體:
來源:轉載
供稿:網友

多線程的相關概念
--------------------------------------------------------------------------------
1.進程:是操作系統結構的基礎;是一個正在執行的程序;計算機中正在運行的程序實例;可以分配給處理器并由處理器執行的一個實體;由單一順序的執行顯示,一個當前狀態和一組相關的系統資源所描述的活動單元。
2.線程:線程是程序中一個單一的順序控制流程。是程序執行流的最小單元。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以并發執行。由于線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。
3.多線程:在單個程序中同時運行多個線程完成不同的工作,稱為多線程。
--------------------------------------------------------------------------------
小結:其實更容易理解一點進程與線程的話,可以舉這樣一個例子:把進程理解成為一個運營著的公司,然而每一個公司員工就可以叫做一個進程。每個公司至少要有一個員工,員工越多,如果你的管理合理的話,公司的運營速度就會越好。這里官味一點話就是說。cpu大部分時間處于空閑時間,浪費了cpu資源,多線程可以讓一個程序“同時”處理多個事情,提高效率。
--------------------------------------------------------------------------------
單線程問題演示
--------------------------------------------------------------------------------
創建一個WinForm應用程序,這里出現的問題是,點擊按鈕后如果在彈出提示框之前,窗體是不能被拖動的。

復制代碼 代碼如下:

private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 10000000000; i++) 
            {
                i += 1;
            }
            MessageBox.Show("出現后能拖動,提示沒出現之前窗體不能被拖動");
        }

原因:運行這個應用程序的時候,窗體應用程序自帶一個叫做UI的線程,這個線程負責窗體界面的移動大小等。如果點擊按鈕則這個線程就去處理這個循環計算,而放棄了其它操作,故而窗體拖動無響應。這就是單線程帶來的問題。

解決辦法:使用多線程,我們自己創建線程。把計算代碼放入我們自己寫的線程中,UI線程就能繼續做他的界面響應了。
--------------------------------------------------------------------------------
線程的創建
--------------------------------------------------------------------------------

 線程的實現:線程一定是要執行一段代碼的,所以要產生一個線程,必須先為該線程寫一個方法,這個方法中的代碼,就是該線程中要執行的代碼,然而啟動線程時,是通過委托調用該方法的。線程啟動是,調用傳過來的委托,委托就會執行相應的方法,從而實現線程執行方法。

復制代碼 代碼如下:

//創建線程 
        private void button1_Click(object sender, EventArgs e)
        {
            //ThreadStart是一個無參無返回值的委托。
            ThreadStart ts = new ThreadStart(js);
            //初始化Thread的新實例,并通過構造方法將委托ts做為參數賦初始值。
            Thread td = new Thread(ts);   //需要引入System.Threading命名空間
            //運行委托
            td.Start();
        }
        //創建的線程要執行的函數。
        void js()
        {
            for (int i = 0; i < 1000000000; i++)
            {
                i += 1;
            }
            MessageBox.Show("提示出現前后窗體都能被拖動");
        }

把這個計算寫入自己寫的線程中,就解決了單線程中的界面無反應缺陷。
--------------------------------------------------------------------------------
小結:創建線程的4個步驟:1.編寫線程索要執行的方法。2.引用System.Threading命名空。3.實例化Thread類,并傳入一個指向線程所要運行方法的委托。4.調用Start()方法,將該線程標記為可以運行的狀態,但具體執行時間由cpu決定。
--------------------------------------------------------------------------------
 方法重入(多個線程執行一個方法)
--------------------------------------------------------------------------------
 由于線程可與同屬一個進程的其它線程共享進程所擁有的全部資源。

所以多個線程同時執行一個方法的情況是存在的,然而這里不經過處理的話會出現一點問題,線程之間先后爭搶資源,致使數據計算結果錯亂。

復制代碼 代碼如下:

public partial class 方法重入 : Form
    {
        public 方法重入()
        {
            InitializeComponent();

            //設置TextBox類的這個屬性是因為,開啟ui線程,
            //微軟設置檢測不允許其它線程對ui線程的數據進行訪問,這里我們把檢測關閉,也就允許了其它線程對ui線程數據的訪問。
            //如果檢測不設置為False,則報錯。
            TextBox.CheckForIllegalCrossThreadCalls = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "0";
            //開啟第一個線程,對js方法進行計算
            ThreadStart ts = new ThreadStart(js);
            Thread td = new Thread(ts);
            td.Start();

            //開啟第二個線程,對js方法進行計算
            ThreadStart ts1 = new ThreadStart(js);
            Thread td1 = new Thread(ts1);
            td1.Start();
        }
        //多線程要重入的方法。
        void js()
        {
            int a = Convert.ToInt32(textBox1.Text);
            for (int i = 0; i < 2000; i++)
            {
                a++;
                textBox1.Text = a.ToString();
            }
        }
    }


出錯現象:點擊按鈕后TextBox1中數據為2000+或2000,如果你看到的數據一直是2000說明你的計算機cpu比較牛X,這樣的話你想看到不是2000的話,你可以多點擊幾次試試,真不行的話,代碼中給TextBox1賦值為0,換做在界面中給textBox1數值默認值為0試試看。

出錯原因:兩個進程同時計算這個方法,不相干擾應該每個線程計算的結果都是2000的,但是這里的結果輸出卻讓人以外,原因是第一個兩個線程同時計算,并不是同時開始計算,而是根據cpu決定的哪個先開始,哪個后開始,雖然相差時間不多,但后開始的就會取用先開始計算過的數據計算,這樣就會導致計算錯亂。

解決辦法:解決這個的一個簡單辦法解釋給方法加鎖,加鎖的意思就是第一個線程取用過這個資源完畢后,第二個線程再來取用此資源。形成排隊效果。

下面給方法加鎖。

復制代碼 代碼如下:

//多線程要重入的方法,這里加鎖。
        void js()
        {
            lock (this)
            {
                int a = Convert.ToInt32(textBox1.Text);
                for (int i = 0; i < 2000; i++)
                {
                    a++;
                    textBox1.Text = a.ToString();
                }
            }
        }

給方法加過鎖后,線程一前一后取用資源,就能避免不可預計的錯亂結果,第一個線程計算為2000,第二個線程計算就是從2000開始,這里的結果就為4000。
--------------------------------------------------------------------------------
小結:多線程可以同時運行,提高了cpu的效率,這里的同時并不是同時開始,同時結束,他們的開始是由cpu決定的,時間相差不大,但會有不可預計的計算錯亂,這里要注意類似上面例子導致的方法重入問題。
--------------------------------------------------------------------------------
 前臺線程后臺線程
--------------------------------------------------------------------------------
 .Net的公用語言運行時能區分兩種不同類型的線程:前臺線程和后臺線程。這兩者的區別就是:應用程序必須運行完所有的前臺線程才可以退出;而對于后臺線程,應用程序則可以不考慮其是否已經運行完畢而直接退出,所有的后臺線程在應用程序退出時都會自動結束。

問題:關閉了窗口,消息框還能彈出。

復制代碼 代碼如下:

private void button1_Click(object sender, EventArgs e)
        {
            //開啟一個線程,對js方法進行計算
            ThreadStart ts2 = new ThreadStart(js);
            Thread td2 = new Thread(ts2);            
            td2.Start();

        }       
        void js()
        {
            for (int i = 0; i < 2000000000; i++)  //如果看不出效果這里的2后面多加0
            {
                i++;
            }
            MessageBox.Show("關閉了窗口我還是要出來的!");
        }


原因:.Net環境使用Thread建立線程,線程默認為前臺線程。即線程屬性IsBackground=false,而前臺線程只要有一個在運行則應用程序不關閉,所以知道彈出消息框后應用程序才算關閉。

解決辦法:在代碼中設置td2.IsBackground=true;
--------------------------------------------------------------------------------
 線程執行帶參數的方法
--------------------------------------------------------------------------------

復制代碼 代碼如下:

//創建一個執行帶參數方法的線程
        private void button1_Click(object sender, EventArgs e)
        {
            //ParameterizedThreadStart這是一個參數類型為object的委托
            ParameterizedThreadStart pts=new ParameterizedThreadStart(SayHello);
            Thread td2 = new Thread(pts);
            td2.Start("張三");  //參數值先入這里
        }
        void SayHello(object name)
        {
            MessageBox.Show("你好,"+name.ToString()+"!");
        }

 線程執行帶多參數的方法
--------------------------------------------------------------------------------
 其實還是帶一參數的方法,只不過是利用參數類型為object的好處,這里將類型傳為list類型,貌似多參。
復制代碼 代碼如下:

 //創建一個執行帶多個參數的方法線程
        private void button1_Click(object sender, EventArgs e)
        {
            List<string> list = new List<string> { "張三", "李四", "王五" };
            //ParameterizedThreadStart這是一個參數類型為object的委托
            ParameterizedThreadStart pts=new ParameterizedThreadStart(SayHello);
            Thread td2 = new Thread(pts);
            td2.Start(list);  //參數值先入這里
        }
        void SayHello(object list)
        {
            List<string> lt = list as List<string>;
            for (int i = 0; i < lt.Count; i++)
            {
                MessageBox.Show("你好," + lt[i].ToString() + "!");
            }
        }

總結:看到這里相信對多線程應該有一個初步的了解了,我就不說了。

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲级视频在线观看免费1级| 欧美日韩xxx| 91久久在线视频| 国产精品一区二区久久精品| 国产成人精品视频| 国产成人福利夜色影视| 日韩在线不卡视频| 国产精品女主播视频| 亚洲天堂精品在线| 日韩亚洲欧美中文高清在线| 久久综合色影院| 亚洲a区在线视频| 久久影视电视剧凤归四时歌| 久久6精品影院| 日韩国产欧美精品在线| 欧美裸体xxxx极品少妇软件| 日韩精品免费视频| 最好看的2019的中文字幕视频| 成人精品福利视频| 91成人福利在线| 久久精品国产一区二区电影| 欧美午夜精品久久久久久浪潮| 欧美一区二区三区图| 亚洲高清福利视频| 国产精品小说在线| 欧美最顶级丰满的aⅴ艳星| 久国内精品在线| 青青a在线精品免费观看| 日韩av综合网| 欧美日韩精品在线视频| 久久手机免费视频| 亚洲xxxxx性| 中文字幕无线精品亚洲乱码一区| 欧美国产日产韩国视频| 日韩电影中文 亚洲精品乱码| 精品成人国产在线观看男人呻吟| 欧美—级a级欧美特级ar全黄| 尤物精品国产第一福利三区| 亚洲人成电影在线播放| 久久久久女教师免费一区| 69精品小视频| 国产视频自拍一区| 国产精品久久久久久久天堂| 91精品国产乱码久久久久久久久| 欧美激情中文字幕在线| 成人免费观看49www在线观看| 亚洲精品自在久久| 91精品中文在线| 成人两性免费视频| 91大神福利视频在线| 久久久国产精品亚洲一区| 精品国产一区二区三区久久久| 欧美中文字幕在线| 国产裸体写真av一区二区| 亚洲91精品在线观看| 波霸ol色综合久久| 国产欧美久久一区二区| 久久国产精品影视| 欧美激情免费观看| 69国产精品成人在线播放| 日韩福利在线播放| 欧美激情二区三区| 欧美成人午夜免费视在线看片| 欧美性猛交xxx| 性色av一区二区咪爱| 91精品国产综合久久香蕉最新版| 亚洲国产天堂网精品网站| 久久影院资源网| 不卡av在线播放| 久久久国产精品x99av| 日本久久久久亚洲中字幕| 国产精品第七十二页| 亚洲精品成人免费| 亚洲女人天堂色在线7777| 国产精品视频1区| 亚洲iv一区二区三区| 92版电视剧仙鹤神针在线观看| 欧美在线激情视频| 68精品久久久久久欧美| 国产成人免费av| 久久伊人91精品综合网站| 91丨九色丨国产在线| 国产精品一二三在线| 国产亚洲欧洲黄色| 亚洲a区在线视频| 91国产中文字幕| 欧美自拍视频在线| 中文字幕视频在线免费欧美日韩综合在线看| 日韩大陆欧美高清视频区| 欧美日韩国产综合视频在线观看中文| 日韩精品在线免费观看视频| 国产欧美韩国高清| 欧美国产中文字幕| 亚洲精品视频二区| 国外成人免费在线播放| 国产亚洲精品日韩| 日韩电影中文字幕一区| 日韩成人黄色av| 中文字幕成人精品久久不卡| 亚洲精品久久久久中文字幕欢迎你| 亚洲精品电影在线| 亚洲成**性毛茸茸| 国产一区二区三区网站| 欧美裸体视频网站| 正在播放国产一区| 亚洲欧美视频在线| 成人网在线视频| 国产成人精品综合久久久| 日韩大陆欧美高清视频区| 亚洲激情视频在线观看| 欧美性xxxx极品高清hd直播| 91在线精品播放| 日本91av在线播放| 精品久久久久久久久国产字幕| 国产精品美女免费看| 国产不卡视频在线| 高清一区二区三区四区五区| 色哟哟网站入口亚洲精品| 亚洲毛片一区二区| 欧美亚洲激情在线| 日韩欧美亚洲一二三区| 色综合久久中文字幕综合网小说| 日本久久久久久久| 九九热在线精品视频| 精品国产乱码久久久久久天美| 成人精品视频在线| 国产精品色午夜在线观看| 欧美成人免费在线观看| 成人久久一区二区| 国产精品一区二区av影院萌芽| 日韩一区二区在线视频| 91av视频在线| 91免费精品视频| 亚洲精品乱码久久久久久金桔影视| 中文字幕亚洲无线码在线一区| 国产日韩欧美在线视频观看| 国产主播精品在线| 91高清在线免费观看| 亚洲色图偷窥自拍| 国产成人精品在线| 91久久精品日日躁夜夜躁国产| 成人美女av在线直播| 日韩亚洲欧美中文在线| 国产视频精品xxxx| 在线观看成人黄色| 国产视频综合在线| 性日韩欧美在线视频| 亚洲欧美日韩第一区| 亚洲精品国产欧美| 日韩欧美在线中文字幕| 亚洲深夜福利在线| 日韩成人网免费视频| 精品国产福利在线| 热99精品里视频精品| 国产成人精品视| 91香蕉嫩草影院入口| 国产精品99久久99久久久二8| 狠狠久久五月精品中文字幕| 亚洲偷熟乱区亚洲香蕉av| 久久99亚洲热视| 欧美亚洲视频在线观看| 91免费电影网站| 欧美激情在线播放| 亚洲最大的成人网|