C#實現非同步編程的兩個簡單機制

來源:互聯網
上載者:User

標籤:使用   os   io   代碼   re   line   

理解程式、進程、線程三者之間的區別:簡而言之,一個程式至少有一個進程,一個進程至少有一個線程
進程就是在記憶體中啟動並執行程式(即運行著的程式);一個進程一般只有一個線程,一個進程可以包含多個線程(多線程編程);

使用非同步編程的簡單機制一:非同步委託
    委託類型的BeginInvoke和EndInvoke方法。
        BeginInvoke方法:
            參數組成:引用方法的參數列表+callback參數+state參數
            傳回值:IAsyncResult介面類型(介面介紹:這個介面有兩個重要屬性:IsCompleted屬性 bool類型 表示非同步線程(方法)是否執行完成;AsyncState。
            這個介面是AsyncResult類的一個成員,這個類還有一個重要的成員:AsyncDeleget 返回被調用的委託的引用)
            
            方法被調用時做了哪些事:
            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
    }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.