首页 > 其他 > 详细

C# 的异步

时间:2014-02-25 23:40:20      阅读:476      评论:0      收藏:0      [点我收藏+]
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)
        {
            Uri HttpSite = new Uri("http://www.baidu.com");
 
            //创建请求对象
            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("示例::");
            Console.WriteLine("ClientGetAsync http://www.microsoft.com/net/");
        }
 
        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;
 
 
        }
 
 
 
    }
}

C# 的异步

原文:http://www.cnblogs.com/xuehaiyiye/p/3566709.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!