求AsyncCallBack的使用说明

半支烟z 2007-06-20 01:25:45
在做TCP Socket异步的程序的时候

使用了AsyncCallBack 的方面知识,可是我还是不能很好的理解

其中一句是:

接受一个AsycCallBack对虾哪个,封装回调方法,并且于Socket网络操作完成之后,返回IAsyncResult接口对象

我不能很好的理解
...全文
334 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzuomin 2007-06-20
  • 打赏
  • 举报
回复
简单地说,同步即程序执行一个方法,等该方法返回之后,继续往下走
异步:即程序调用一个方法后立即返回。

等待高手作答。呵呵
wzuomin 2007-06-20
  • 打赏
  • 举报
回复
AsycCallBack我也讲不清楚,这儿有篇文章介绍vb.net下的Socket异步通讯的例子

http://track.cnblogs.com/archive/2005/09/26/244673.aspx
说明 : 一、概念 借用横刀天笑的解释这个Comet概念:“像彗星那样拖着长长的尾巴的http长连接”。事实上大家都知道,http是不可以与服务器持久连接的,要是每个请都与服务器持久连接的话,那服务器早就宕掉了,就像前段时间像博客园连接数超过2000就出来了Service Unavailable一样。。 就像网上的解释: step 1.向服务器发出请 step 2.服务器端查看是否有数据 step 3.如果有数据,则向客户端发送数据,结束该请,返回Step1 step 4.如果没有数据,等待,直到有数据出现,进入step 3 通过以上几步可以看出,客户端与服务器是始终维持着一个连接的,这样看起来,就像客户端与服务器端始终有一个没有关闭的连接一样。也就是他们说的"HTTP长连接". 二、基于ASP.NET和jQuery的Comet实现 其实jQuery只是一个手段,这里用到它的Ajax部分,用于向服务器端发送请。在我的源码中,就是用于负责向服务器端发送两个请:1、发送数据 2、发送等待请(当服务器有数据时该请会返回后再次发送) 至于服务器端,如何实现判断服务器有数据便返回,没有数据便等待的功能呢?Google一下,可以知道ASP.NET实现异步处理的话,实现IHttpAsyncHandler接口就可以了。该接口的BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)方法返回一个IAsyncResult对象。当不调用其参数cb的回调函数时,该请不会结束。 故我们可以在该方法中做一下文章,用一个单例模式实现的消息处理类Messages将所有请的IAsyncResult对象保存起来,这样便可以知道有多少个客户端发送了请,同时也可以遍历所有的IAsyncResult对象,实现向其客户端主动发送数据的功能。 上面说了,jQuery会发送两个请,第二个就是一个“等待请”,当服务器端主动发送了数据到客户端时,该请便能够收到服务器发送的数据。这样便完成了一次服务器向客户端主动发送数据。再次建立等待请,重复循环,实现“长连接”。
运行环境 .NET Framework2.0 开发工具 Microsoft Visual Studio 2005 二. 部分代码说明(主要讲解异步分析和下载): 异步分析下载采取的策略是同时分析同时下载,即未等待数据全部分析完毕就开始把已经分析出来的图片链接开始下载。下载成功的均在List框链接前面划上了√ ,未能下载的图片有可能是分析错误或者是下载异常。 1. 异步分析部分代码 /// /// 异步分析下载 /// private void AsyncAnalyzeAndDownload(string url, string savePath) { this.uriString = url; this.savePath = savePath; #region 分析计时开始 count = 0; count1 = 0; freq = 0; result = 0; QueryPerformanceFrequency(ref freq); QueryPerformanceCounter(ref count); #endregion using (WebClient wClient = new WebClient()) { AutoResetEvent waiter = new AutoResetEvent(false); wClient.Credentials = CredentialCache.DefaultCredentials; wClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(AsyncURIAnalyze); wClient.DownloadDataAsync(new Uri(uriString), waiter); //waiter.WaitOne(); //阻止当前线程,直到收到信号 } } /// /// 异步分析 /// protected void AsyncURIAnalyze(Object sender, DownloadDataCompletedEventArgs e) { AutoResetEvent waiter = (AutoResetEvent)e.UserState; try { if (!e.Cancelled && e.Error == null) { string dnDir = string.Empty; string domainName = string.Empty; string uri = uriString; //获得域名 http://www.sina.com/ Match match = Regex.Match(uri, @"((http(s)?://)?)+[\w-.]+[^/]");//, RegexOptions.IgnoreCase domainName = match.Value; //获得域名最深层目录 http://www.sina.com/mail/ if (domainName.Equals(uri

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧