在页面加载期间,可能有些操作是要比较耗用时间的(例如调用外部资源,要长时间等待其返回),正常情况下,这个操作将一直占用线程。而大家知道,ASP.NET在服务端线程池中的线程数是有限的,如果一直占用的话,就会导致其他操作需要等待。

在ASP.NET 2.0中,提供了一种异步页的技术。微软有一个专门的文档介绍这个技术

看看下面这个图,很重要

【注意】ASP.NET的异步机制与windows From的异步机制有一个根本区别,就是因为Response不可以分布发送到客户端的,所以,这个异步的效果对客户端来说可能是效果不明显的。也就说客户还是一样等待所有的操作完成之后才能看到页面。但是,使用了异步技术后,服务器端的线程能得到更好的利用,从另外一个层面是提高性能。

下面我用一个简单的例子来演示如何使用该技术

1. 页面需要启用async支持

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication2._Default" Async="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
    <link rel="Stylesheet" href="default.css" />
</head>
<body>
    <form id="form1" runat="server">
    <div  id="mydiv" runat="server">
    </div>
    </form>
</body>
</html>

2.通过一个独立的类型(class)定义长时间执行任务的操作

using System;
using System.Collections.Generic;
using System.Web;

using System.Threading;

namespace WebApplication2
{
    public class LongTimeTask
    {
        public string Result = string.Empty;
        public HelloWorldHandler handler;

public delegate string HelloWorldHandler();
        public string HelloWorld()
        {
            Thread.Sleep(5000);
            return "Hello,world";
        }

public IAsyncResult OnBegin(object sender, EventArgs e,
    AsyncCallback cb, object extraData)
        {
            handler = new HelloWorldHandler(this.HelloWorld);
            return handler.BeginInvoke(cb, extraData);

}

public void OnEnd(IAsyncResult ar)
        {
            Result = handler.EndInvoke(ar);
        }

public void OnTimeout(IAsyncResult ar)
        {
            Result = "超时了";
        }
    }
}

3. 在页面的Page_Load事件中,注册异步任务

LongTimeTask task;
protected void Page_Load(object sender, EventArgs e)
{

task= new LongTimeTask();
    PageAsyncTask asynctask = new PageAsyncTask(task.OnBegin, task.OnEnd, task.OnTimeout, null);
    RegisterAsyncTask(asynctask);

}

4. 在页面的OnPreRenderComplete的方法里面接收异步任务的结果

protected override void OnPreRenderComplete(EventArgs e)
{
    mydiv.InnerHtml = task.Result;
}

【注意】值得一说的是,如果是调用Web Service,也可能会需要比较长时间,但因为Web Service的异步调用有内部的支持。不需要我们像上面这样复杂。

例如,有下面这样一个服务

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using System.Threading;

namespace WebApplication2
{
    /// <summary>
    /// demoService 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class demoService : System.Web.Services.WebService
    {

[WebMethod]
        public string HelloWorld()
        {
            Thread.Sleep(5000);  
            return "Hello World";
        }
    }
}

添加对其引用之后,我们在页面代码中大致是这样的

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Linq;

using System.Threading;

namespace WebApplication2
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

localhost.demoService proxy = new localhost.demoService();
            proxy.HelloWorldCompleted += new WebApplication2.localhost.HelloWorldCompletedEventHandler(proxy_HelloWorldCompleted);//绑定一个完成事件
            proxy.HelloWorldAsync();//开始异步调用

}

void proxy_HelloWorldCompleted(object sender, WebApplication2.localhost.HelloWorldCompletedEventArgs e)
        {
            mydiv.InnerHtml = e.Result;
        }

}
}

可以看到,这种方式简单多了。

其他内置支持异步的场景还有IO操作。这里就不一一描述了

本文由作者:陈希章 于 2009/7/12 19:55:32 发布在:http://www.cnblogs.com/chenxizhang/
本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心

如何在ASP.NET页面中使用异步任务(PageAsyncTask)相关推荐

  1. 如何在asp.net页面使用css和js

    一.如何在asp.net页面中使用css 1.可以直接写在需要样式控制的控件里  例如:<div style="border:#ff6100 1px solid">&l ...

  2. 在ASP.NET页面中动态添加控件

    今天被问到如何在ASP.NET 页面中动态创建一批控件,并且希望在后续代码中能访问到这些动态创建的控件.我用下面的例子来解释这个问题 ================================= ...

  3. 如何在 ASP.NET MVC 中集成 AngularJS(2)

    在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...

  4. 如何在 ASP.NET Core 中使用 Quartz.NET 执行任务调度

    当我们在web开发中,常常会遇到这么一个需求,在后台执行某一项具体的任务,具体的说就是这些任务必须在后台定时执行. Quartz.NET 是一个开源的 JAVA 移植版,它有着悠久的历史并且提供了强大 ...

  5. 如何在 Asp.Net Core 中对请求进行限流

    译文链接:https://www.infoworld.com/article/3442946/how-to-implement-rate-limiting-in-aspnet-core.html 在应 ...

  6. 如何在 ASP.NET MVC 中集成 AngularJS(3)

    今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...

  7. 如何在 ASP.NET MVC 中集成 AngularJS

    介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务.另外,还有最新的数据库技术.最新 ...

  8. 在Asp.net页面中实现数据饼图

    ASP.NET之所以能够在客户端浏览器中形成各种数据图片,是因为在ASP.NET中提供了绘图功能,具体的作法是先在服务器端创建一个Bitmap实例,然后利用ASP.NET中提供的绘图功能,按照要生成的 ...

  9. 在ASP.NET页面中实现数据柱状图

    棒图有时又称为"Bar"图,在ASP.NET中拥有了一个新功能--绘图功能,通过此功能就能够按照要实现的图表的模样来绘制,最后在客户端的浏览器中形成一个图片,从而显示出图表来. 本 ...

最新文章

  1. 升级 90天 vs2008 在win2008下。
  2. (转载)机器学习知识点(十二)坐标下降法(Coordinate descent)
  3. 销售订单定价-客户取值
  4. robot wireless communication
  5. 漫谈LiteOS之开发板-GPIO(基于GD32450i-EVAL)
  6. MySQL高级知识(七)——索引面试题分析
  7. 一文了解十大 Java 开发者必备测试框架!
  8. java输出5行星型三角_JAVA图形小动画之简单行星运动
  9. Mac otool替代readelf命令
  10. Android移动应用基础教程【数据存储】
  11. 通过银行卡号获取银行名称
  12. eplan加密狗已损坏_[转载]EPLAN Electric P8 仿真加密狗 error 1068 问题
  13. ADS学习:谐波分析和参数扫描
  14. VMware Workstation Server 服务器启动报1075错误
  15. java游戏猿人时代_猿人时代BT版_JAVA游戏免费版下载_7723手机游戏[www.7723.cn]
  16. 达梦数据库基础篇--数据库管理工具
  17. UEFI+GPT更换硬盘GHOST,DD也可以。
  18. 查看 class 文件
  19. Thinkphp5的项目配置到西部数码虚拟主机
  20. python3的urllib3和requests

热门文章

  1. Centos6.4建立本地yum源
  2. 从蜘蛛网到物联网 这张网人类织了多久?
  3. Python+selenium自动化测试中Windows窗口跳转方法
  4. ACM Computer Factory
  5. Android 动画小知识点
  6. U3D架构系列之- FSM有限状态机设计五
  7. Access数据库中Sum函数返回空值(Null)时如何设置为0
  8. maven的安装和环境配置的过程记录
  9. js和Java分别正则匹配小数点后多余的0
  10. goaccess在定时任务中不执行的问题