01-多線程及異步委託

1、多線程:多線程

一、概念:異步

線程:是Windows任務調度的最小單位。線程是程序中的一個執行流,每一個線程都有本身的專有寄存器(棧指針、程序計數器等),但代碼區是共享的,即不一樣的線程能夠執行一樣的函數。
多線程:是指程序中包含多個執行流,即在一個程序中能夠同時運行多個不一樣的線程來執行不一樣的任務(代碼),也就是說容許單個程序建立多個並行執行的線程來完成各自的任務。 
 
二、爲何要用多線程:
①讓計算機"同時"作多件事情,節約時間。
②多線程可讓一個程序「同時」處理多個事情。
③後臺運行程序,提升程序的運行效率,也不會使主界面出現無響應的狀況。
 
三、產生一個線程的4步驟:
編寫產生線程所要執行的方法
引用System.Threading命名空間
實例化Thread類,並傳入一個指向線程所要運行方法的委託。(這時候這個線程已經產生,可是尚未運行)
調用Thread實例的Start方法,標記該線程能夠被CPU執行了,但具體執行時間由CPU決定。
 
四、.net中如何實現多線程:
線程確定也是要執行一段代碼的。因此要產生一個線程,必須先爲該線程寫一個方法,這個方法中的代碼就是該線程運行所要執行的代碼。(找我的來作一件事情)
線程啓動時,經過委託調用該方法。(委託的好處)

(線程啓動時,調用傳過來的委託,委託就會執行相應的方法,實現線程執行方法)ide

案例代碼:函數

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace _07多線程
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("主線程 {0} 正在執行中...", Thread.CurrentThread.ManagedThreadId);

            #region 線程
            //ThreadStart 無參無返回值的委託
            Thread thread = new Thread(ShowMsg);//新開啓一個線程執行一個方法
            //建議操做系統把當前線程搞成高級別
            thread.Priority = ThreadPriority.Highest;
            //給開發人員用,來識別不一樣的線程
            thread.Name = "zy";
            //後臺線程: 若是全部的前臺線程都退出了,那麼後臺線程自動被關閉
            thread.IsBackground = true;
            thread.Start();//並無執行,告訴操做系統準備就緒
            //thread.Abort();//關閉線程
            Console.ReadKey();       
            #endregion

        }

        static void ShowMsg()
        {
            Console.WriteLine("工做線程 {0} 執行中...",Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(2000);
        }
    }
}
View Code

運行截圖:spa

五、Thread類的一些重要成員:操作系統

Start()啓動線程
Abort()終止線程
Thread.Sleep(1) 靜態方法,可使當前線程中止一段時間運行
Name線程名
Thread.CurrentThread得到當前的線程引用
 
-----------------------------------------------------------------------------------
2、委託的異步調用:
一、瞭解一下幾點:
BeginInvoke  異步調用
EndInvoke     獲取異步調用的(方法)返回值
IAsyncResult  異步操做的狀態
AsyncResult   異步操做的結果(能夠獲取當前執行的委託對象)
using System.Runtime.Remoting.Messaging;
注意:委託的異步調用只對單播委託
 
案例代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.Remoting.Messaging;

namespace _07多線程
{
    public delegate int AddDel(int a,int b);//聲明一個有參數有返回值的委託
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("主線程 {0} 正在執行中...", Thread.CurrentThread.ManagedThreadId);

            AddDel addDel = new AddDel(AddFunc);

            //1.同步調用
            //int c = addDel(1, 2);

            //2.無回調函數的異步調用
            //啓動委託指向的方法來執行,具體由線程池提供一個線程來執行當前的委託指向的方法
            //IAsyncResult ascResult = addDel.BeginInvoke(1, 2, null, null);
            //while (!ascResult.IsCompleted)
            //{ 
            //    //主線程執行的其餘操做
            //}
            ////此EndInvoke方法會阻塞當前線程。直到委託方法執行完畢後,
            ////並將返回值交給result後,繼續執行後面的代碼
            //int result = addDel.EndInvoke(ascResult);
            //Console.WriteLine(result);//3
            //Console.ReadKey();

            //3.有回調函數的異步調用
            IAsyncResult ascResult = addDel.BeginInvoke(1, 2, MyDelCallBack, 3);

            //主線程可繼續執行其餘操做
            Console.WriteLine("===========");
            Console.ReadKey();
        }

        static int AddFunc(int a, int b)
        {
            Console.WriteLine("AddFunc工做線程運行中...{0}", Thread.CurrentThread.ManagedThreadId);
            //Thread.Sleep(1000);
            return a + b;
        }

        //異步委託執行完成了的回調函數
        public static void MyDelCallBack(IAsyncResult result)
        {
            //把接口類型轉換成實例類型
            AsyncResult aResult = (AsyncResult)result;

            //轉換成咱們本身的委託類型
            AddDel del = (AddDel)aResult.AsyncDelegate;

            //執行完成獲取執行的結果
            int addResult = del.EndInvoke(result);
            int state = (int)aResult.AsyncState;//3

            Console.WriteLine("異步完成的回調方法執行的結果是:{0} @{1}", addResult, Thread.CurrentThread.ManagedThreadId);
        }
    }   
}
View Code

運行截圖:.net

執行步驟:線程

①從線程池裏獲取一個線程。指針

②執行委託指向的方法(在工做線程裏面執行)code

③調用回調函數(若是是null不執行)。

相關文章
相關標籤/搜索