C# 異步發送HttpWebRequest


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM