质疑贴——对《新版微软一站式示例代码库》中的一个示例的质疑

简介:

在“新版微软一站式示例代码库发布 - 绑定第三版示例代码浏览器”中,有若干最新的asp.net的示例。

  对其中的一个示例的源代码研究了一番。觉得有问题,故在此阐述本人的疑问,望广大网友赐教。

  先把这个示例的说明贴在下方。

  CSASPNETReverseAJAX, VBASPNETReverseAJAX

  Downloads 
CSASPNETReverseAJAX: http://code.msdn.microsoft.com/CSASPNETReverseAJAX-7a1f0c2b 
VBASPNETReverseAJAX: http://code.msdn.microsoft.com/VBASPNETReverseAJAX-321a68b0

  反向Ajax又叫Comet模式Ajax, 推模式Ajax, 双向Web和 服务器推模式. 这种技术维护着一个HTTP请求来允许服务器向浏览器推送数据, 而不需要每隔一段特定的时间不断地向服务器提交请求. 这个示例演示了如何在ASP.NET Ajax里使用这种技术。

  

  按照上文的文字的理解。应该是浏览器这一端是被动方。而服务器这一端是主动方。服务器在获得消息的更新后,主动通知客户端更新消息的内容。如果是这样就太好了。可是看了源代码后,却发现貌似不是那么一回事。要么就是自己的理解上有问题。

  先看看各个文件的作用

  Sender.aspx                  客户端发送消息的页面

  Receiver.aspx                  客户端获得消息的页面

  Message.vb、ClientAdapter.vb、Client.vb    服务器端处理消息的类(采用单实例模式,有点像静态类)

  Dispatcher.asmx.vb               服务器端返回消息的WebService

 

  那么看看各个文件的关键部分的代码

  先看看Sender.aspx,客户端发送消息的页面

  Protected Sub btnSend_Click(ByVal sender As ObjectByVal e As EventArgs
' Create a message entity to contain all necessary data. 
Dim message As New Message() 
message.RecipientName = tbRecipientName.Text.Trim() 
message.MessageContent = tbMessageContent.Text.Trim() 
 
If Not String.IsNullOrWhiteSpace(message.RecipientName) AndAlso Not String.IsNullOrEmpty(message.MessageContent) Then 
' Call the client adapter to send the message to the particular recipient instantly. 
ClientAdapter.Instance.SendMessage(message) 
 
' Display a timestamp. 
lbNotification.Text += DateTime.Now.ToLongTimeString() & ": Message sent!<br/>
End If 
End Sub

  这个函数就是当“发送消息”按钮按下时,将客户端的消息写到后台的静态类中。

    

  Message.vb、ClientAdapter.vb、Client.vb这三个文件是后台的消息处理静态类,和本文的质疑无关。就不详细说了。

 

  再看看Dispatcher.asmx.vb,服务器端返回消息的WebService。它将合适的消息返回给调用者。

  <WebMethod()>Public Function WaitMessage(ByVal userName As StringAs String 
Return ClientAdapter.Instance.GetMessage(userName) 
End Function

 

  最后看看Receiver.aspx,客户端获得消息的页面。它是如何获得后台即时消息的。

  Protected Sub Page_PreRender(ByVal sender As ObjectByVal e As EventArgs) 
' Activate the JavaScript waiting loop. 
If Session("userName"IsNot Nothing Then 
Dim userName As String = DirectCast(Session("userName"), String
 
' Call JavaScript method waitEvent to start the wait loop. 
ClientScript.RegisterStartupScript(Me.[GetType](), "ActivateWaitingLoop""waitEvent();"True
 
lbNotification.Text = String.Format("Your user name is <b>{0}</b>. It is waiting for new message now.", userName) 
 
' Disable the login. 
tbUserName.Visible = False 
btnLogin.Visible = False 
End If 
End Sub

  从这一段代码可以看出,在页面完成时,注册了一个JS代码,这个代码是waitEvent();

  我们看看这个页面的waitEvent()的代码,看看做了一些什么事。

  <script type="text/javascript"> 
// This method will persist a http request and wait for messages. 
function waitEvent() { 
 
VBASPNETReverseAJAX.Dispatcher.WaitMessage("<%= Session("userName") %>",  
function (result) {        
displayMessage(result); 
// Keep looping. 
setTimeout(waitEvent, 0); 
},

        function () { 
           // Keep looping. 
setTimeout(waitEvent, 0); 
}); 

 

    // Append a message content to the result panel. 
function displayMessage(message) { 
var panel = document.getElementById("<%= lbMessages.ClientID %>"); 
 
panel.innerHTML += currentTime() + ": " + message + "<br />"; 

 
// Return a current time string. 
function currentTime() { 
var currentDate = new Date() 
return currentDate.getHours() + ":" + currentDate.getMinutes() + ":" + currentDate.getSeconds(); 

</script>

 

  这一段的JS代码,是调用后台的WebService,将后台的消息显示到页面上。

  可是,为了达到“实时”的效果。它用了下面的一句话

  setTimeout(waitEvent, 0); 

  第二个参数是0,也就意味着是立即调用。

  通观整个waitEvent代码,实际上就是一个不停的调用后台的WebService,来获得消息。这似乎还是客户端是主动端,而且由于是一刻不停的调用后台的WebService,岂不是比间隔一段时间调用后台的WebService更加耗费资源吗?如果客户端只有一个还好,若是有成百上千的这样的客户端,那服务器岂不是负担很重?

 

  这是我看了源代码后的质疑。也许是哪儿我理解错了。望网友指正赐教。

 


    本文转自万仓一黍博客园博客,原文链接:http://www.cnblogs.com/grenet/archive/2011/04/21/2023336.html,如需转载请自行联系原作者

相关文章
|
缓存 JSON API
Elasticsearch-05Elasticsearch之查询与过滤
Elasticsearch-05Elasticsearch之查询与过滤
567 0
|
IDE Java 测试技术
IDEA安装并使用通义灵码
本文介绍了“通义灵码”这一智能编码助手的功能特点,并提供了在IDEA中安装和使用的详细步骤,旨在帮助提升编程效率和代码质量。
IDEA安装并使用通义灵码
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
287 1
|
11月前
|
人工智能 运维 Devops
基于云效落地平台工程企业级最佳实践
本文介绍了平台工程作为DevOps演进的必然方向,探讨了其建设过程中面临的挑战及解决方案。文中首先分析了平台工程与DevOps的关系,强调了其在提升价值交付和降低团队心智负担方面的作用。接着,通过云效作为基础设施,详细阐述了其如何帮助企业构建高效的研发平台,并分享了两个实际案例:一个是200人规模的互联网企业,另一个是2000人规模的金融行业企业。最后,展望了平台工程的未来发展方向,包括组件化开发、AI技术的应用以及智能化场景的融入。碧桂园生活服务集团也分享了其在平台工程领域的实践经验和未来思考,强调了标准化、自动化、可靠性和智能化四大原则的重要性。
280 10
|
11月前
|
人工智能 API 开发者
阿里CEO吴泳铭-2024互联网大会发言:AI的最大价值是推动生产力变革
11月21日,2024年世界互联网大会“互联网企业家论坛”在乌镇召开。阿里巴巴CEO吴泳铭表示,AI的最大价值在于推动各行各业的生产力变革,而非仅限于开发超级APP。他强调,发展AI需建设繁荣的技术、产品和市场生态。目前,30多万家企业已接入阿里“通义”大模型,应用于代码开发、药物研发等场景。阿里巴巴坚持开源路线,全球开发者基于“通义千问”开发的衍生模型已突破7.8万个。吴泳铭认为,AI的发展需要行业共同努力,建设繁荣生态以实现高质量持续发展。
|
机器学习/深度学习 人工智能 自然语言处理
人工智能与艺术创作:机器与创造力
【10月更文挑战第31天】本文探讨了人工智能在艺术创作中的应用,涵盖绘画、音乐和文学等领域。通过深度学习、生成模型和强化学习等技术,AI正重新定义创造力的概念,辅助艺术家创作,并激发新的艺术形式。文章还讨论了AI对人类创造力的影响及未来发展趋势。
|
传感器 安全 物联网
5G与物联网:加速产业数字化转型
【10月更文挑战第26天】
332 0
|
机器学习/深度学习 人工智能 自然语言处理
人工智能算法原理
人工智能(AI)属计算机科学,聚焦于模拟人类智慧的技术与系统的研发。本文概览常见AI算法原理:机器学习含监督(如决策树、支持向量机)、无监督(如聚类、主成分分析)及强化学习算法;深度学习涉及卷积神经网络、循环神经网络和生成对抗网络;自然语言处理涵盖词袋模型、循环神经网络语言模型及命名实体识别等。这些算法支撑着AI技术的广泛应用与发展。
961 0
|
UED 开发者 异构计算
浏览器刷新率是什么?
【5月更文挑战第29天】浏览器刷新率是什么?
820 1
|
开发框架 前端开发 JavaScript
若依怎样看开发文档,域名搜这个就行ruoyi.vip,建链接点击在线文档,有前端手册和后端手册,若依文档里有项目扩展,项目扩展有大量的开源的软件
若依怎样看开发文档,域名搜这个就行ruoyi.vip,建链接点击在线文档,有前端手册和后端手册,若依文档里有项目扩展,项目扩展有大量的开源的软件