从博客园那弄来了。自己写一个例子,对比了一下啊。还是异步速度快
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
}
}
}
//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
}
}
}
相关文章推荐
- 【微博SDK调用逻辑】微博SDK的调用逻辑,最好自己还是写一个例子,试一下!!!
- 自己写了一个js,但是最终不能控制住最后后的提交,前面的还是比较完美,大家看到后,能帮我解决一下吗?
- 网上只写了一个文件断点下载的例子! 我仿照别人得例子 自己增加了自己代码,异步下载文件 支持断点下载 多任务下载! 如有问题 请联系我
- java POI 操作EXCEL小例子!自己整理了一下,里面属性,功能挺全的!
- Gridview行上下移动自己做的一个小例子(第一种方法)
- 一个例子说明java数据类型包括对象是赋值还是引用!!!
- 一个比较不错的开源博客,可以参考一下,自己搭建
- 有了自己的一个小空间真好!坚持把matlab的笔记写下来(理想还是要有的)
- Hibernate例子-自己写的一个干净的给予注解的Hibernate例子
- 还是有必要确定一下自己到底在做是什么
- 自己写的一个HOOKAPI的汇编例子
- 关于attr的用法,自己写的一个例子。
- 编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词。程序应该找出满足一下条件的单词:该单词的后面紧接着再次出现自己本身。跟踪重复次数最多的单词及其重复次数,输出.
- 一个关于Applet的例子,需要的可以参考一下!
- 博客园的速度还是很让人满意的
- 自己写的一个SQL的学习的例子
- jsonp 自己写的一个例子
- java几种集合遍历速度对比(博客园迁移)
- 实现了一个比nginx速度更快的HTTP服务器 - clowwindy - 博客园
- 一个sql例子,分组,查询,统计等操作,老忘记,记录一下