1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144 |
using
System; using
System.Collections.Generic; using
System.Linq; using
System.Text; using
System.Net; using
System.IO; using
System.Threading; namespace
AsncyHandle { 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 ; } } class
Program { public
static ManualResetEvent allDone = new
ManualResetEvent( false ); const
int BUFFER_SIZE = 1024; static
void Main( string [] args) { //创建请求对象 HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(HttpSite); //创建请求对象 RequestState rs = new
RequestState(); //将请求添加到状态,以便可以被来回传涕 rs.Request = wreq; //发出异步请求 IAsyncResult r = (IAsyncResult)wreq.BeginGetResponse( new
AsyncCallback(RespCallback), rs); // 将 ManualResetEvent 设置为 Wait, // 以便在调用回调前,应用程序不退出 allDone.WaitOne(); } public
static void showusage() { Console.WriteLine( "尝试获取 (GET) 一个 URL" ); Console.WriteLine( "\r\n用法::" ); Console.WriteLine( "ClientGetAsync URL" ); Console.WriteLine( "示例::" ); } 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; // 请注意,rs.BufferRead 被传入到 BeginRead。 // 这是数据将被读入的位置。 IAsyncResult iarRead = responseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new
AsyncCallback(ReadCallBack), rs); } private
static void ReadCallBack(IAsyncResult asyncResult) { //从asyncresult 获取 RequestState 对象 RequestState rs = (RequestState)asyncResult.AsyncState; //取出在respCallBack 中设置的ResponseStream Stream responseStream = rs.ResponseStream; 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 stirngBuilder对象中 //该对想包含在RequestState中 rs.RequestData.Append(str); 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(); //设置ManualResetEvent ,以便主线程可以退出 allDone.Set(); } return ; } } } |
原文:http://www.cnblogs.com/xuehaiyiye/p/3566709.html