using System; namespace ConsoleApplication1 { class Class1 { //聲明委托 public delegate void AsyncEventHandler(); //異步方法 void Event1() { Console.WriteLine("Event1 Start"); System.Threading.Thread.Sleep(4000); Console.WriteLine("Event1 End"); } // 同步方法 void Event2() { Console.WriteLine("Event2 Start"); int i=1; while(i<1000) { i=i+1; Console.WriteLine("Event2 "+i.ToString()); } Console.WriteLine("Event2 End"); } [STAThread] static void Main(string[] args) { long start=0; long end=0; Class1 c = new Class1(); Console.WriteLine("ready"); start=DateTime.Now.Ticks; //實例委托 AsyncEventHandler asy = new AsyncEventHandler(c.Event1); //異步調用開始,沒有回調函數和AsyncState,都為null IAsyncResult ia = asy.BeginInvoke(null, null); //同步開始, c.Event2(); //異步結束,若沒有結束,一直阻塞到調用完成,在此返回該函數的return,若有返回值。 asy.EndInvoke(ia); //都同步的情況。 //c.Event1(); //c.Event2(); end =DateTime.Now.Ticks; Console.WriteLine("時間刻度差="+ Convert.ToString(end-start) ); Console.ReadLine(); } } }
HttpWebRequest
ClientGetAsync.cs
using System; using System.Net; using System.IO; /// <summary> /// Summary description for ClientGetAsync /// </summary> public class ClientGetAsync { public ClientGetAsync() { } public static void SendGetAsync(string url) { // 從命令行獲取 URI Uri HttpSite = new Uri(url); // 創建請求對象 HttpWebRequest wreq = WebRequest.Create(HttpSite) as HttpWebRequest; // 創建狀態對象 RequestState rs = new RequestState(); rs.Request = wreq; IAsyncResult ar = wreq.BeginGetResponse(new AsyncCallback(RespCallback), rs); } public static void RespCallback(IAsyncResult ar) { // 從異步結果獲取 RequestState 對象 RequestState rs = (RequestState)ar.AsyncState; // 從 RequestState 獲取 HttpWebRequest HttpWebRequest req = rs.Request; // 調用 EndGetResponse 生成 HttpWebResponse 對象 // 該對象來自上面發出的請求 HttpWebResponse resp = (HttpWebResponse)req.EndGetResponse(ar); // 既然我們擁有了響應,就該從 // 響應流開始讀取數據了 Stream ResponseStream = resp.GetResponseStream(); // 該讀取操作也使用異步完成,所以我們 // 將要以 RequestState 存儲流 rs.ResponseStream = ResponseStream; System.Threading.Thread.Sleep(10000); // 請注意,rs.BufferRead 被傳入到 BeginRead。 // 這是數據將被讀入的位置。 IAsyncResult iarRead = ResponseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs); } public static void ReadCallBack(IAsyncResult asyncResult) { // 從 asyncresult 獲取 RequestState 對象 RequestState rs = (RequestState)asyncResult.AsyncState; // 取出在 RespCallback 中設置的 ResponseStream Stream responseStream = rs.ResponseStream; // 此時 rs.BufferRead 中應該有一些數據。 // 讀取操作將告訴我們那里是否有數據 int read = responseStream.EndRead(asyncResult); if (read > 0) { // 准備 Char 數組緩沖區,用於向 Unicode 轉換 Char[] charBuffer = new Char[BUFFER_SIZE]; // 將字節流轉換為 Char 數組,然后轉換為字符串 // len 顯示多少字符被轉換為 Unicode int len = rs.StreamDecode.GetChars(rs.BufferRead, 0, read, charBuffer, 0); String str = new String(charBuffer, 0, len); // 將最近讀取的數據追加到 RequestData stringbuilder 對象中, // 該對象包含在 RequestState 中 rs.RequestData.Append(str); // 現在發出另一個異步調用,讀取更多的數據 // 請注意,將不斷調用此過程,直到 // responseStream.EndRead 返回 -1 IAsyncResult ar = responseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs); } else { if (rs.RequestData.Length > 1) { // 所有數據都已被讀取,因此將其顯示到控制台 string strContent; strContent = rs.RequestData.ToString(); Console.WriteLine(strContent); } // 關閉響應流 responseStream.Close(); } return; } public static int BUFFER_SIZE = 1024; }
RequestState.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.IO; using System.Net; /// <summary> /// Summary description for RequestState /// </summary> public class RequestState { const int BUFFER_SIZE = 1024; public StringBuilder RequestData; public byte[] BufferRead; public HttpWebRequest Request; public Stream ResponseStream; // 創建適當編碼類型的解碼器 public Decoder StreamDecode = Encoding.UTF8.GetDecoder(); public RequestState() { BufferRead = new byte[BUFFER_SIZE]; RequestData = new StringBuilder(""); Request = null; ResponseStream = null; } }
調用
ClientGetAsync.SendGetAsync("http://www.amazon.com/");