异步获取远程文件

using System;
using System.IO;
using System.Net;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Test
{
public class RequestState
{
const int BUFFER_SIZE = 1024;
public StringBuilder requestData;
public byte[] BufferRead;
public HttpWebRequest request;
public HttpWebResponse response;
public Stream streamResponse;

public RequestState()
{
BufferRead
= new byte[BUFFER_SIZE];
requestData
= new StringBuilder("");
request
= null;
streamResponse
= null;
}
}

public class HttpWebRequest_BeginGetResponse
{
public static ManualResetEvent allDone = new ManualResetEvent(false);
const int BUFFER_SIZE = 1024;
const int DefaultTimeout = 2 * 60 * 1000; // 2 minutes timeout

// Abort the request if the timer fires.
private static void TimeoutCallback(object state, bool timedOut)
{
if (timedOut)
{
HttpWebRequest request
= state as HttpWebRequest;
if (request != null)
{
request.Abort();
}
}
}

public void Read()
{
try
{
// Create a HttpWebrequest object to the desired URL.
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(@"http://passport.cnblogs.com/login.aspx");

RequestState myRequestState
= new RequestState();
myRequestState.request
= myHttpWebRequest;

IAsyncResult result
= (IAsyncResult)myHttpWebRequest.BeginGetResponse(new AsyncCallback(RespCallback), myRequestState);
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle,
new WaitOrTimerCallback(TimeoutCallback), myHttpWebRequest, DefaultTimeout, true);
allDone.WaitOne();
myRequestState.response.Close();
}
catch (WebException e)
{
Console.WriteLine(
"\nMain Exception raised!");
Console.WriteLine(
"\nMessage:{0}", e.Message);
Console.WriteLine(
"\nStatus:{0}", e.Status);
Console.WriteLine(
"Press any key to continue..........");
}
catch (Exception e)
{
Console.WriteLine(
"\nMain Exception raised!");
Console.WriteLine(
"Source :{0} ", e.Source);
Console.WriteLine(
"Message :{0} ", e.Message);
Console.WriteLine(
"Press any key to continue..........");
Console.Read();
}
}
private static void RespCallback(IAsyncResult asynchronousResult)
{
try
{
// State of request is asynchronous.
RequestState myRequestState = (RequestState)asynchronousResult.AsyncState;
HttpWebRequest myHttpWebRequest
= myRequestState.request;
myRequestState.response
= (HttpWebResponse)myHttpWebRequest.EndGetResponse(asynchronousResult);

// Read the response into a Stream object.
Stream responseStream = myRequestState.response.GetResponseStream();
myRequestState.streamResponse
= responseStream;

// Begin the Reading of the contents of the HTML page and print it to the console.
IAsyncResult asynchronousInputRead = responseStream.BeginRead(myRequestState.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
return;
}
catch (WebException e)
{
Console.WriteLine(
"\nRespCallback Exception raised!");
Console.WriteLine(
"\nMessage:{0}", e.Message);
Console.WriteLine(
"\nStatus:{0}", e.Status);
}
allDone.Set();
}

private static void ReadCallBack(IAsyncResult asyncResult)
{
try
{
RequestState myRequestState
= (RequestState)asyncResult.AsyncState;
Stream responseStream
= myRequestState.streamResponse;
int read = responseStream.EndRead(asyncResult);
// Read the HTML page and then print it to the console.
if (read > 0)
{
myRequestState.requestData.Append(Encoding.ASCII.GetString(myRequestState.BufferRead,
0, read));
IAsyncResult asynchronousResult
= responseStream.BeginRead(myRequestState.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
return;
}
else
{
Console.WriteLine(
"\nThe contents of the Html page are : ");
if (myRequestState.requestData.Length > 1)
{
string stringContent;
stringContent
= myRequestState.requestData.ToString();
Console.WriteLine(
"\t");
Console.WriteLine(
"\t");
Console.WriteLine(
"\t");
Console.WriteLine(
"\t");
Console.WriteLine(stringContent);
Console.WriteLine(
"\t");
Console.WriteLine(
"\t");
}
Console.WriteLine(
"Press any key to continue..........");
Console.ReadLine();

responseStream.Close();
}
}
catch (WebException e)
{
Console.WriteLine(
"\nReadCallBack Exception raised!");
Console.WriteLine(
"\nMessage:{0}", e.Message);
Console.WriteLine(
"\nStatus:{0}", e.Status);
}
allDone.Set();
}
}
}

 

posted @ 2010-08-04 16:39  李占卫  阅读(398)  评论(0编辑  收藏  举报