从博客园那弄来了。自己写一个例子,对比了一下啊。还是异步速度快

来源:互联网 发布:免费打电话软件 编辑:程序博客网 时间:2024/05/01 12:45

ex_1:

//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading;

//namespace ConsoleApplication1
//{
//    class Program
//    {
        ////声明委托
        //public delegate void AsyncEventHandler();
        ////异步方法
        //static void Event1()
        //{
        //    Console.WriteLine("Event1 Start");
        //    Thread.Sleep(4000);
        //    Console.WriteLine("Event1 End");
        //}
        ////同步方法
        //static void Event2()
        //{
        //    Console.WriteLine("Event2 Start");
        //    int i = 1;
        //    while (i < 1000)
        //    {
        //        i = i + 1;
        //        Console.WriteLine("Event2" + i.ToString());
        //    }
        //    Console.WriteLine("Event2 End");
        //}

        //static void Main(string[] args)
        //{
            //long start = 0;
            //long end = 0;
            //start = DateTime.Now.Ticks;
            ////AsyncEventHandler asy = new AsyncEventHandler(Event1);
            ////IAsyncResult ia = asy.BeginInvoke(null, null);
            ////同步开始
            //Event1();
            //Event2();
            //end = DateTime.Now.Ticks;
            //Console.WriteLine("时间刻度差" + Convert.ToString(start - end));
            //Console.ReadLine();
//        }
//    }
//}

ex_2

/****************************************************
文件名:AsyHelper
CLR版本:2.0.50727.3625
创建人:Administrator
创建日期:2011-12-28 13:30:42
******************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net;
using System.IO;

class AsyHelper
{
    public static ManualResetEvent allDone = new ManualResetEvent(false);

    const int BUFFER_SIZE = 1024;

    static string strContent = string.Empty;

    public static string GetHtmlContent(string url)
    {
        // 从命令行获取 URI
        Uri HttpSite = new Uri(url);

        // 创建请求对象
        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();
        return strContent;
    }
    private 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;

        // 此时 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)
            {
                // 所有数据都已被读取,因此将其显示到控制台
                strContent = rs.RequestData.ToString();
            }
            // 关闭响应流
            responseStream.Close();
            // 设置 ManualResetEvent,以便主线程可以退出
            allDone.Set();
        }
    }
}

 

调用程序:

 

using System;
using System.Net;
using System.Threading;
using System.Text;
using System.IO;
using finChinaframe;

namespace ConsoleApplication1
{
    // ClientGetAsync 发出异步请求
    class ClientGetAsync
    {
        static WebGrab myCore = new WebGrab();
        static Messagetype mess = new Messagetype();
        public static void Main(string[] args)
        {
            #region 异步请求页面
            long start = 0;
            long end = 0;
            start = DateTime.Now.Ticks;
            string url = "http://price.taikang.com/ec/mfinsure/accdetailB.jsp?accid=506006&accname=货币避险型投资账户";
            //异步
            Console.WriteLine(AsyHelper.GetHtmlContent(url));
            ////同步
            //Console.WriteLine(myCore.Grab(url, ref mess));
            end = DateTime.Now.Ticks;
            Console.Write("时间差:" + Convert.ToString(end - start));
            Console.ReadLine();
            #endregion
        }
    }
}


 

原创粉丝点击