asp.net 3.5异步调用方法小结

本文介绍ASP.NET中使用自定义类实现网页内容的异步加载及WebService的异步调用,通过具体代码示例展示了如何封装异步读取过程,并在页面加载时并行执行多个异步任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

web请求
RssAsync.aspx

     // 这是调用本网站的两个页面,也可以设置成外部网站页面
     const   string  rssFeed1  =   " http://localhost:2289/AsnicTest/WebRequest1.aspx " ;
    
const   string  rssFeed2  =   " http://localhost:2289/AsnicTest/WebRequest2.aspx " ;

    AsyncReader rss1, rss2;

    
protected   void  Page_Load( object  sender, EventArgs e)
    {
        PreRenderComplete 
+=   new  EventHandler(RssAsync_PreRenderComplete);

        rss1 
=   new  AsyncReader(rssFeed1);
        rss2 
=   new  AsyncReader(rssFeed2);

        PageAsyncTask task1 
=   new  PageAsyncTask( new  BeginEventHandler(rss1.BeginRead),  new  EndEventHandler(rss1.EndRead),  null null true );
        PageAsyncTask task2 
=   new  PageAsyncTask( new  BeginEventHandler(rss2.BeginRead),  new  EndEventHandler(rss2.EndRead),  null null true );

        RegisterAsyncTask(task1);
        RegisterAsyncTask(task2);
    }

    
void  RssAsync_PreRenderComplete( object  sender, EventArgs e)
    {
        Literal1.Text 
=  rss1.GetData();
        Literal1.Text 
+=  rss2.GetData();
    }
AsyncReader是封装的一个类,代码如下:
ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

using System.Net;
using System.IO;
using System.Text;


/// <summary>
///AsyncReader 的摘要说明
/// </summary>
public class AsyncReader
{
    
private WebRequest _req;
    
private string _rssData;
    
private string _url;

    
public AsyncReader(string url)
    {
        _url 
= url;
    }

    
public IAsyncResult BeginRead(object sender, EventArgs e, AsyncCallback cb, object state)
    {
        _req 
= WebRequest.Create(_url);

        IAsyncResult obj 
= _req.BeginGetResponse(cb,state);
        
return obj;
    }

    
public void EndRead(IAsyncResult ar)
    {
        String str;
        
using (WebResponse response = _req.EndGetResponse(ar))
        {
            StreamReader reader;
            
using (reader = new StreamReader(response.GetResponseStream()))
            {
                str 
= reader.ReadToEnd();
            }
            _rssData 
= formateStr(str);
        }
    }

    
/// <summary>
    
/// 格式化字符,比如xml格式等。这里我就直接返回了,实例而已
    
/// </summary>
    
/// <returns></returns>
    private string formateStr(string str)
    {
        
return str;
    }

    
/// <summary>
    
/// 获取异步调用返回的数据
    
/// </summary>
    
/// <returns></returns>
    public string GetData()
    {
        
return _rssData;
    }
}

 

WebService异步调用
1.asp.net 2.0开始,提供简单的方法实现异步调用
AsyncWebService.aspx.cs

     protected   void  Page_Load( object  sender, EventArgs e)
    {
        
this .getHello();
    }

    
private   void  getHello()
    {
        webServerAsync.WebService1 hello 
=   new  webServerAsync.WebService1();

        
/// 同步调用WebService方法
         // Literal1.Text = hello.HelloAsync("张三", 30);

        
// 异步调用WebService方法
        hello.HelloWorldCompleted  +=   new  webServerAsync.HelloWorldCompletedEventHandler(hello_HelloWorldCompleted);
        hello.HelloWorldAsync(
" 张三 " 20 );
    }

    
void  hello_HelloWorldCompleted( object  sender, webServerAsync.HelloWorldCompletedEventArgs e)
    {
        Literal1.Text 
=  e.Result;
    }


为了调用方便,以及代码重用,我也封装了一个类
AsyncWebService.aspx.cs

    helloRader hello1, hello2;
    
public   string  helloData;

    
protected   void  Page_Load( object  sender, EventArgs e)
    {
        
if  ( ! IsPostBack)
            dataBind();
    }

    
private   void  dataBind()
    {
        PreRenderComplete 
+=   new  EventHandler(RssAsync_PreRenderComplete);

        hello1 
=   new  helloRader( " 张三 " 20 );
        hello2 
=   new  helloRader( " 李四 " 22 );

        PageAsyncTask task1 
=  AsyncTask(hello1);
        PageAsyncTask task2 
=  AsyncTask(hello2);

        RegisterAsyncTask(task1);
        RegisterAsyncTask(task2);
    }

    
private  PageAsyncTask AsyncTask(helloRader hello)
    {
        
return   new  PageAsyncTask( new  BeginEventHandler(hello.BeginRead),  new  EndEventHandler(hello.EndRead),  null null true );
    }

    
void  RssAsync_PreRenderComplete( object  sender, EventArgs e)
    {
        Literal1.Text 
=  hello1.GetData()  +   " </br> " ;
        Literal1.Text 
+=  hello2.GetData();
    }

helloRader.cs
ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

/// <summary>
///helloRader 的摘要说明
/// </summary>
public class helloRader
{
    
private webServerAsync.WebService1 _req;
    
private string _rssData;

    
private string _user;
    
private int _age;

    
public helloRader(string user,int age)
    {
        
//
        
//TODO: 在此处添加构造函数逻辑
        
//
        _user = user;
        _age 
= age;
    }

    
public IAsyncResult BeginRead(object sender, EventArgs e, AsyncCallback cb, object state)
    {
        _req 
= new webServerAsync.WebService1();

        IAsyncResult obj 
= _req.BeginHelloWorld(_user,_age,cb, state);
        
return obj;
    }

    
public void EndRead(IAsyncResult ar)
    {
        String str;
        str 
= _req.EndHelloWorld(ar);
        _rssData 
= str;
    }

    
/// <summary>
    
/// 格式化字符,比如xml格式等。这里我就直接返回了,实例而已
    
/// </summary>
    
/// <returns></returns>
    private string formateStr(string str)
    {
        
return str;
    }

    
/// <summary>
    
/// 获取异步调用返回的数据
    
/// </summary>
    
/// <returns></returns>
    public string GetData()
    {
        
return _rssData;
    }
}
源码下载

转载于:https://www.cnblogs.com/timy/archive/2009/02/21/1395534.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值