委托實(shí)現(xiàn)C#異步調(diào)用淺析
委托實(shí)現(xiàn)C#異步調(diào)用是怎么實(shí)現(xiàn)的呢?委托實(shí)現(xiàn)C#異步調(diào)用是使用BeginInvoke及回調(diào)函數(shù)的使用:
委托實(shí)現(xiàn)C#異步調(diào)用的步驟:
1.定義委托。
2.將要進(jìn)行異步調(diào)用的方法“實(shí)例化”到定義的委托。
3.在委托上調(diào)用BeginInvoke方法。其中,BeginInvoke的參數(shù)由三個(gè)部分構(gòu)成。***部分:所定義的委托的函數(shù)簽名。
第二部分:希望調(diào)用的回調(diào)函數(shù)的委托。第三部分:自定義委托的實(shí)例(該實(shí)例將會(huì)在回調(diào)函數(shù)中的IAsyncResult的AsyncRState屬性中重構(gòu)出我們?cè)诓襟E2中定義的委托實(shí)例,并借助這個(gè)實(shí)例來調(diào)用EndInvoke方法。)
4.如果我們希望在當(dāng)前線程來處理異步調(diào)用的結(jié)果,則可以使用BeginInvoke方法返回一個(gè)IAsyncResult實(shí)例(例如ar)
并在當(dāng)前線程等待。如果我們希望在異步線程中通過回調(diào)函數(shù)來處理結(jié)果,則我們需要在3中傳遞一個(gè)回調(diào)委托,并在該處理中調(diào)用EndInvoke方法。
委托實(shí)現(xiàn)C#異步調(diào)用的一段實(shí)例:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading;
- namespace property
- {
- public class DelegateClass
- {
- public delegate int AsyncSampDelegate();
- public event AsyncSampDelegate delEvent;
- public void Run()
- {
- Console.WriteLine("The Run Thread is {0}",
- Thread.CurrentThread.GetHashCode());
- foreach (AsyncSampDelegate del in
- delEvent.GetInvocationList())
- {
- del.BeginInvoke(new AsyncCallback(ReturnAsync), del);
- }
- }
- public void ReturnAsync(IAsyncResult ar)
- {
- //獲得調(diào)用委托實(shí)例的引用
- AsyncSampDelegate del = (AsyncSampDelegate)ar.AsyncState;
- int result = del.EndInvoke(ar);
- Console.WriteLine("The result is {0},
- The Thread is {1}", result, Thread.CurrentThread.GetHashCode());
- }
- }
- public class FirstSubscribe
- {
- private int myCount = 0;
- public void AddFunToDel(DelegateClass tmpDel)
- {
- tmpDel.delEvent+=new DelegateClass.
- AsyncSampDelegate(FirstFun);
- }
- public int FirstFun()
- {
- return myCount++;
- }
- }
- public class SecondSubscribe
- {
- private int myCount = 0;
- public void AddFunToDel(DelegateClass tmpDel)
- {
- tmpDel.delEvent+=new DelegateClass.
- AsyncSampDelegate(SecondFun);
- }
- public int SecondFun()
- {
- return myCount += 2;
- }
- }
- public class App
- {
- static void Main()
- {
- DelegateClass delClass = new DelegateClass();
- FirstSubscribe fs = new FirstSubscribe();
- SecondSubscribe ss = new SecondSubscribe();
- fs.AddFunToDel(delClass);
- ss.AddFunToDel(delClass);
- Console.WriteLine("The Main Thread is {0}",
- Thread.CurrentThread.GetHashCode());
- delClass.Run();
- Console.Read();
- }
- }
- }
委托實(shí)現(xiàn)C#異步調(diào)用的基本情況就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)委托實(shí)現(xiàn)C#異步調(diào)用有所幫助。
【編輯推薦】