• C# 的异步


    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("
    用法::");
                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;
    
    
            }
    
    
    
        }
    }
    
  • 相关阅读:
    /etc/init.d/functions: No such file or directory报错问题
    在Linux上安装Python3.7.1
    python 使用openpyxl实现读写xlsx文件
    Git 撤销本地修改
    element的el-table表格自定义表头,slot="header"内,数据不更新的问题
    记录下本地修改文件名称大小写问题线上说找不到文件
    解决国内访问github慢的问题笔记
    vue项目中使用echarts实现疫情地图
    uni-app项目搭建
    uniapp引入uni-ui组件报错TypeError: this.getOptions is not a function
  • 原文地址:https://www.cnblogs.com/xuehaiyiye/p/3566709.html
Copyright © 2020-2023  润新知