您的位置:首页 > 其它

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

2011-12-29 16:19 671 查看
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

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐