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/");