thelastmarine

博客园 首页 新随笔 联系 订阅 管理

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

 

 

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), nullnulltrue);
        PageAsyncTask task2 
= new PageAsyncTask(new BeginEventHandler(rss2.BeginRead), new EndEventHandler(rss2.EndRead), nullnulltrue);

        RegisterAsyncTask(task1);
        RegisterAsyncTask(task2);
    }

    
void RssAsync_PreRenderComplete(object sender, EventArgs e)
    {
        Literal1.Text 
= rss1.GetData();
        Literal1.Text 
+= rss2.GetData();
    }
复制代码
AsyncReader是封装的一个类,代码如下:

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), nullnulltrue);
    }

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

helloRader.cs

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;
    }
}
源码下载

 

posted on 2012-06-25 17:13  何冲  阅读(1689)  评论(0编辑  收藏  举报