`
piperzero
  • 浏览: 3555244 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Web中使用多线程来增强用户体验

阅读更多

前几天遇到了一个问题,我在页面逻辑里需要调用一个webservice,处理一个比较耗时的操作,但是我不需要知道其返回值。于是我希望asp.net能像winform一样使用自动生成的webservice异步方法

你是不是想说:在页面调用webservice的时候,直接调用其异步实现不就完了吗?

这其实是行不通的,为了实现异步调用,我们需要对页面进行小小的改动,在Page元素里加上Async=true

我们很快就会发现这样做的问题:

让我们测试一下吧,现在我们在一个webservice的Helloworld方法中放入一个Thread。Sleep(10000),然后调用他的异步实现。通过调试,我们可以发现虽然程序运行至HelloworldAsync时,非常快速的返回并往下运行,但是当所有逻辑处理完成后,页面并不Response,而是硬生生等待我们的线程睡醒了才返回。

可是如果我希望真正做到调了不管怎么办呢?

sync

你可以使用Thread,或者ThreadPool,自己来启动一个线程,我推荐使用ThreadPool,这样的话,这些线程都会被iis的线程池管理起来,不会造成崩溃

我们来分析一下这两种模式的运用有什么特点

WebService自带的异步模式为下图的模式

Async1

主线程调用子线程执行一个耗时操作(work1),同时执行一系列同步操作(w2...w5),然后交给w1返回

这种模式适合于work1有返回的情况,并且为了让work1得到充分的工作时间,异步调用的过程开始的越早越好,对web程序设计者而言,这里有一个很重要的问题:线程占用。。

刚才我们谈过,asp.net中每个请求都会有有一个线程来处理,而可以使用的线程是有限的,服务器会使用一个线程池来管理线程,当线程耗尽,ok,新来的请求只能蹲着排队,所以对web开发者而言,线程是个宝贵的资源,所以这个方案在并行处理的同时也增加了耗尽线程池的风险,毕竟一个请求造成了多个线程

用线程池来实现的模式属于下图

Async2

这种模式适合无返回的情况,这种情况下,对子线程的调用应该越晚越好,我们可以看到,主、子线程共存的时间越短,我们的稀缺资源线程就越安全,请注意的是,也许总的执行时间不会比同步的情况更少,但是我们很快就返回了用户界面,所以用户体验能够得到提高

使用web多线程的缺点 :

看了上面的叙述,你也许会说,那干脆把我所有的调用都改成异步调用吧,你尽管去做吧,绝对是一场灾难,因为在异步的同时,一定一会产生一个新的线程等待调用的返回,即使你调用函数的返回值为void,所以异步调用的负面效果将是会产生许多子线程,所以注意当你的调用非常耗时,这个子线程也将长期占用你的线程池,如果这样的调用大量出现,照样会消耗掉所有的可用线程

那么什么情况下适合在web上使用哪种多线程模式呢

我们来看看这段伪代码,他的用途是提交一个报告,方法传入一个报告,并从一个WebService中获得一些报告的内容,接着插入数据库,然后在文件服务器上生成一个报告文件,最后发出一个通知,让我们逐条命令的过一下这个方法,看看什么地方适合改为异步调用?(记得我们的讨论都是基于web的,关于桌面运用的多线程请参考 多线程总结一)

public void CreateReport(Report report){

//从webservice上取得报告的一些信息,不取得这些信息报告,报告是不完整的,是不能提交的

Report fullreport=CallWebService(report);

//插入数据库,很重要的工作

InsertIntoDataBase(fullreport)

try{

//生成报告文件,这里是一个耗时而且容易出错的操作

WriteStaticFile(fullreport)

}

catch{//记录错误日志。。。。}

//这个只是通知邮件

CallMailService2(fullreport)

}

第一条语句CallWebService()从一个webservice里加载一些报告的内容,这个是业务逻辑相关的,因为如果不加载的话报告内容是不完整的,不能提交,显然不能改为异步调了不管的模式,在这里你可以尝试模式一,但是这个改动是没有作用的,因为其他所有的过程,包括插入数据库,生成报告都依赖于这个方法的返回,所以如果我们在这里使用异步的话,其他的所有操作都必须等待他的返回,所以采用异步除了多增加了线程以外,一点时间也不能节省

再来看插入数据库,和上面一样也没有必要使用异步调用

生成报告这里比较有趣,确实他是一个和逻辑息息相关的操作,但是通过分析代码,我们可以看出,虽然报告生成是一个重要业务步骤,但是并没有严格到说"如果不能生成报告,就必须回滚上面的操作",并且如果操作失败,在catch中也仅仅是记录了日志,并没有需要尝试重写的逻辑,(很有可能另外的某个程序或者某人,会定时查看日志,发现有错误就重新生成文件)也就是说,就这段代码而言,生成也可以算一个额外逻辑,那么自然也可以去异步操作.可是:千万注意!!

由于生成报告需要的时间较长,那么生成报告的子线程会长时间运行,长期无法返回线程池,如果请求量太大,频率太快,那就会耗尽线程资源了.

平心而论,这个问题其实不是异步造成的,即使时同步调用,执行此操作也需要化肥很长时间,调用量太大,频率太快,也会造成排队.而且由于返回时间太长,用户体验也不会好,所以我们的这个改造应该是有益的

(注:关于报告生成,我在与一个同事讨论这种思想的时候,他就认为这个地方应该有一个写入队列,因为显然生成文件的速度和其他处理速度是不匹配的,这确实是一个比较合理的做法)

分享到:
评论

相关推荐

    asp.net多线程

    在给定的文件中,我们看到一个简单的Web表单示例,它利用多线程来处理后台的长时间运行任务,并在前台显示进度更新,从而提高用户体验。下面我们将深入探讨 ASP.NET 多线程的相关知识点。 1. **多线程概念**: 多...

    狂神说多线程详解.rar

    多线程是现代计算机编程中的一个重要概念,尤其在处理高性能计算、并发操作以及实时系统时,多线程技术显得尤为重要。它允许程序同时执行多个任务,提高系统的效率和响应速度。 一、多线程的基本概念 1. 线程:线程...

    Android下http多线程下载

    在Android平台上,实现HTTP多线程下载是一项常见的需求,它能显著提高大文件下载的速度,尤其是在网络环境不稳定或带宽有限的情况下。...通过以上步骤,你可以构建出一个高效的多线程下载系统,提升用户的下载体验。

    利用多线程做的摇奖机

    此摇奖机程序的独特之处在于,它运用了多线程技术来创建数字浮动效果,从而提供更流畅、更真实的用户体验。 【多线程】 多线程是操作系统中的一个概念,它允许程序同时执行多个任务或操作。在C#中,我们可以使用`...

    基于Qt的多线程下载工具

    总的来说,"基于Qt的多线程下载工具"是一个集成了多种下载协议的实用程序,它充分利用了Qt框架的功能和多线程技术的优势,为用户提供高效、稳定的文件下载体验。无论是对于个人用户还是开发者来说,理解和掌握这样的...

    C#编写Http多线程文件下载

    本篇文章将深入探讨如何使用C#来实现Http多线程文件下载。 一、Http协议基础 Http(超文本传输协议)是互联网上应用最为广泛的一种网络协议,用于从Web服务器传输超文本到本地浏览器。在C#中,我们可以使用...

    Java多线程技术在WebGIS客户端小程序中的应用.zip

    WebGIS是互联网与地理信息系统结合的产物,它允许用户通过Web浏览器访问和操作地理信息,而多线程技术则能提升这些操作的并发性和用户体验。 首先,我们需要理解Java多线程的基本概念。在Java中,多线程是指一个...

    java多线程在webgis的应用

    3. **数据展示与处理**:多线程技术可以用于并发处理图形渲染、地图绘制等耗时操作,提供流畅的动态地图展示效果,增强用户体验。 4. **空间分析与查询**:空间分析和地理查询通常涉及复杂的计算,多线程可以将这些...

    java多线程详解

    以HotJava Web浏览器为例,其多线程特性允许用户在浏览网页的同时下载Applet或图像、播放动画和声音等,极大地提升了用户体验。这种多任务并行处理的能力正是多线程技术在实际应用中的体现。 综上所述,Java的多...

    使用Java开发的地图瓦片图下载工具,支持以下XYZ瓦片图下载与合并 多线程瓦片图下载,最大限度地使用本机网络资源

    多线程下载不仅提高了效率,还能在一定程度上防止由于单个连接问题导致的下载中断,增强了整个下载过程的稳定性。 在实现过程中,该工具可能涉及了以下几个关键的技术点: 1. **网络编程**:Java的`java.net`包...

    基于Java的多线程网络爬虫设计与实现.pdf

    ### 基于Java的多线程网络爬虫设计与实现 #### 一、引言与背景 在当今数字化时代,互联网成为人们获取信息的主要渠道,而搜索引擎则是导航这一庞大信息海洋的关键工具。搜索引擎的核心技术之一是网络爬虫(Web ...

    深入体验Java Web开发内幕 张孝祥

    再者,对于现代Web开发,可能会讲解到JavaScript和Ajax技术,以及前端框架,如jQuery或Vue.js,它们用于增强用户体验,实现页面的异步更新。同时,可能会介绍RESTful API的设计和使用,以及JSON作为数据交换格式的...

    简单web浏览器设计

    7. **多线程**:为了保证用户体验,浏览器通常会使用多线程来分离网络请求、HTML解析、JavaScript执行和UI更新,以避免阻塞。 8. **内存管理与安全性**:C++编程需要特别关注内存管理,防止内存泄漏和悬挂指针。...

    CamtdChrome多线程下载管理器插件可满速下载百度网盘文件

    7. **版本控制**:项目中的版本标识"514ff96"可能来自Git,表明Camtd的开发过程中使用了版本控制系统来管理代码变更。 8. **Web应用程序接口(API)**:插件可能使用了如XMLHttpRequest或Fetch API来与服务器进行...

    多线程精品资源--Chrome multi-threaded download manager extension,.zip

    在描述中,虽然没有提供具体的细节,但我们可以推测这个资源可能包含一个或多个这样的扩展,用于增强Chrome浏览器的下载功能,使其支持多线程下载。这通常意味着用户可以设置同时进行的下载任务数量,以优化网络带宽...

    深入体验Java+Web开发内幕-高级特性-高清扫描版

    - **多线程编程**:Java提供了丰富的API来支持多线程,如`Thread`类、`Runnable`接口和`ExecutorService`。书中可能深入讲解线程同步、死锁和并发容器如`ConcurrentHashMap`等。 - **反射机制**:通过反射,开发者...

    pthread 线程标准 (中)

    在实际开发中,利用pthread标准进行多线程编程,可以显著提升应用程序的并发处理能力和用户体验。例如,在Web服务器中,使用多线程模型可以并行处理来自多个客户端的请求,减少响应时间;在数据处理领域,多线程技术...

    HTML5中新支持的多线程API实现手工制定异步任务无需浏览器等待

    总的来说,HTML5的Web Workers API是提升Web应用性能的重要工具,它允许开发者利用多线程技术来优化JavaScript的执行,尤其是对于处理大量数据和复杂计算的场景,Web Workers能显著提升用户体验。同时,虽然有一些...

Global site tag (gtag.js) - Google Analytics