从博客园那弄来了。自己写一个例子,对比了一下啊。还是异步速度快
来源:互联网 发布:免费打电话软件 编辑:程序博客网 时间: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
}
}
}
- 从博客园那弄来了。自己写一个例子,对比了一下啊。还是异步速度快
- 今天又来关注了一下自己的博客
- 好久没写博客了,今天来写一个.
- 大三了,写博客来温习自己的学习内容
- 记录一下-自己写的一个项目夭折了
- JavaMail例子网上貌似可用的JavaMail例子不多,自己写了一个,以备后用,从QQ发没问题
- 该自己写博客了
- 博客写了有两三个月了,,访问量终于到了10000~~~谈一下自己的感想
- 毕业快一年了,从CSDN的博客开始记录一下工作的轨迹。
- 毕业快一年了,从CSDN的博客开始记录一下工作的轨迹。
- 分享一下自己写的Python 3的各种PDF文档【花了半年时间那】
- POJ 1580 String Matching 很纠结,代码写了很多,还是过了,再对比一下人家的代码,惭愧
- 第一次来CSDN写自己的博客,关于面试的题目,我差不多面试一个月了
- 整理了一下自己的博客分类
- 我是博客专家了, 鼓励自己一下
- 年底了,也来点评一下自己
- 自己创业了 ,大家来支持一下
- 开始写博客了,纪念一下
- introduction to JAVA-based open-source P2P architect
- 用户界面控件命名规范
- 黑马程序员:内省
- Ole了解
- 走过2011年
- 从博客园那弄来了。自己写一个例子,对比了一下啊。还是异步速度快
- 架构设计之性能设计经验
- 禁止页面缓存的方法
- 移动优先很好,但我想快好省的将现有网站移动化
- 延伸正规表示法
- JS 字符串转整型
- 公钥,私钥,SSL(讲的很生动)
- 我们如何让产品 backlog 停留在业务层次上
- 快捷支付单方便划款,支付宝绑架银行,网银安全关卡成马其诺防线?