C#實現異步編程的兩個簡單機制(異步委託&定時器)及Thread實現多線程

建立線程的經常使用方法:異步委託、定時器、Thread類編程

 

理解程序、進程、線程三者之間的區別:簡而言之,一個程序至少有一個進程,一個進程至少有一個線程
進程就是在內存中運行的程序(即運行着的程序);一個程序通常只有一個進程,一個進程能夠包含多個線程(多線程編程);數組

 

委託本質是類,查看生產的微軟中間代碼便可知道,該類中包含 BeginInvoke和EndInvoke方法多線程

.class public auto ansi sealed Core.MyFirstDelege
    extends [mscorlib]System.MulticastDelegate
{
    // Methods
    .method public hidebysig specialname rtspecialname 
        instance void .ctor (
            object 'object',
            native int 'method'
        ) runtime managed 
    {
    } // end of method MyFirstDelege::.ctor

    .method public hidebysig newslot virtual 
        instance object Invoke (
            object o
        ) runtime managed 
    {
    } // end of method MyFirstDelege::Invoke

    .method public hidebysig newslot virtual 
        instance class [mscorlib]System.IAsyncResult BeginInvoke (
            object o,
            class [mscorlib]System.AsyncCallback callback,
            object 'object'
        ) runtime managed 
    {
    } // end of method MyFirstDelege::BeginInvoke

    .method public hidebysig newslot virtual 
        instance object EndInvoke (
            class [mscorlib]System.IAsyncResult result
        ) runtime managed 
    {
    } // end of method MyFirstDelege::EndInvoke

} // end of class Core.MyFirstDelege

 


使用異步編程的簡單機制一:異步委託
    委託類型的BeginInvoke和EndInvoke方法。
        BeginInvoke方法:
            參數組成:引用方法的參數列表+callback參數+state參數
            返回值:IAsyncResult接口類型(接口介紹:這個接口有兩個重要屬性:IsCompleted屬性 bool類型 表示異步線程(方法)是否執行完成;
            AsyncResult類實現了IAsyncResult,它有一個重要的成員:AsyncDeleget 返回被調用的委託的引用)異步

      IAsyncResult類型的方法:.AsyncWaitHandle.WaitOne(50,false)   指定時間間隔內異步方法還沒運行完畢 返回false  不然返回true
            
            方法被調用時作了哪些事:
            1.在線程池中獲取一個線程,當這個線程被調度時,執行委託列表方法;
            2.返回給主線程一個IAsyncResult對象的引用;
            
        EndInvoke方法:
            參數組成:IAsyncResult類型
            返回值:被調用的委託的返回值類型
            
             方法被調用時作了哪些事:
             根據參數:IAsyncResult對象找到關聯的線程,
             若是這個線程已經執行完畢,EedInvoke作以下有些事:清理線程的狀態和資源;找到引用方法的返回值,並把它做爲本身的返回值返回。
             若是這個線程沒有執行完畢,調用線程就會中止並等待,知道清理完成並返回值。
            

異步編程的三者模式:等待直到完成模式、輪詢模式、回調模式.
下面給個回調模式的列子:
    public class TestThreading
    {
        public static int Method(int n, int m)
        {
            Console.WriteLine("異步方法內部開始");
            System.Threading.Thread.Sleep(5000);
            return n > m ? n : m;
        }

        public static void CallBack(IAsyncResult ia)
        {

            AsyncResult ar = (AsyncResult)ia;
            MyDel del = (MyDel)ar.AsyncDelegate;
            int result = del.EndInvoke(ia);
            Console.WriteLine(result);

        }
    }
    
    static void Main(string[] args)
    {
            #region 異步編程與線程
            
            Console.WriteLine("Main中的處理代碼。。。。。");
            MyDel del = new MyDel(TestThreading.Method);
            Console.WriteLine("BeginInvoke 方法調用以前");
            IAsyncResult ia = del.BeginInvoke(32, 100, TestThreading.CallBack, null);
            Console.WriteLine("BeginInvoke調用以後,Main繼續作別的事情");
            System.Threading.Thread.Sleep(5000);
            Console.WriteLine("Main 程序結束");
            
            #endregion
    }
    
使用異步編程的簡單機制二:計時器
.Net BCL 提供了好幾個Timer類,在這裏我只介紹System.Threading中的Timer
首先看下Timer最經常使用的構造函數:
Timer(TimerCallback callback,objec state,int dueTime,int period)

下面分別介紹下各個參數,介紹完了你就會用Timer實現異步編程了:
TimerCallback 是一個委託類型,定義以下   void TimerCallback(object state) 這個就是回調函數,計時器在每次時間到時執行回調方法
state 就是要傳給回調方法的參數
dueTime 就是回調方法在第一次被執行以前的時間
period 是兩次調用回調方法之間的時間間隔

Demo以下:

    public class TestTimer
    {
        public static void TimerCallBack(object o)
        {
            Console.WriteLine("{0},{1}",o,DateTime.Now.ToString("yy:MM:dd HH:mm:ss"));
        }
    }
    
     static void Main(string[] args)
    {
    
        #region Timer類的使用(System.Threading下的)使用Timer發異步(回調函數)

        Timer time = new Timer(TestTimer.TimerCallBack, "lxf", 5000, 1000);

        #endregion
    }

ide

相關文章
相關標籤/搜索