MSDN官方的ASP.Net异步页面的经典示例代码

时间:2022-04-24
本文章向大家介绍MSDN官方的ASP.Net异步页面的经典示例代码,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

示例1.演示异步获取一个网址的内容,处理后显示在OutPut这一Label上

using System;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Net;

using System.IO;

using System.Text;

using System.Text.RegularExpressions;



public partial class AsyncPage : System.Web.UI.Page

{

    private WebRequest _request;



    void Page_Load (object sender, EventArgs e)

    {

        AddOnPreRenderCompleteAsync (

            new BeginEventHandler(BeginAsyncOperation),

            new EndEventHandler (EndAsyncOperation)

        );

    }



    IAsyncResult BeginAsyncOperation (object sender, EventArgs e, 

        AsyncCallback cb, object state)

    {

        _request = WebRequest.Create("http://msdn.microsoft.com");

        return _request.BeginGetResponse (cb, state);

    }

    void EndAsyncOperation (IAsyncResult ar)

    {

        string text;

        using (WebResponse response = _request.EndGetResponse(ar))

        {

            using (StreamReader reader = 

                new StreamReader(response.GetResponseStream()))

            {

                text = reader.ReadToEnd();

            }

        }



        Regex regex = new Regex ("href\s*=\s*"([^"]*)"", 

            RegexOptions.IgnoreCase);

        MatchCollection matches = regex.Matches(text);



        StringBuilder builder = new StringBuilder(1024);

        foreach (Match match in matches)

        {

            builder.Append (match.Groups[1]);

            builder.Append("<br/>");

        }



        Output.Text = builder.ToString ();

    }

}

示例2:演示如何异步从数据库查询数据,并将返回的DataReader绑定到指定控件上

using System;

using System.Data;

using System.Data.SqlClient;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.Configuration;



public partial class AsyncDataBind : System.Web.UI.Page

{

    private SqlConnection _connection;

    private SqlCommand _command;

    private SqlDataReader _reader;





    protected void Page_Load(object sender, EventArgs e)

    {

        if (!IsPostBack)

        {

            // Hook PreRenderComplete event for data binding

            this.PreRenderComplete += 

                new EventHandler(Page_PreRenderComplete);



            // Register async methods

            AddOnPreRenderCompleteAsync(

                new BeginEventHandler(BeginAsyncOperation),

                new EndEventHandler(EndAsyncOperation)

            );

        }

    }

    IAsyncResult BeginAsyncOperation (object sender, EventArgs e, 

        AsyncCallback cb, object state)

    {

        string connect = WebConfigurationManager.ConnectionStrings

            ["PubsConnectionString"].ConnectionString;

        _connection = new SqlConnection(connect);

        _connection.Open();

        _command = new SqlCommand(

            "SELECT title_id, title, price FROM titles", _connection);

        return _command.BeginExecuteReader (cb, state);

    }



    void EndAsyncOperation(IAsyncResult ar)

    {

        _reader = _command.EndExecuteReader(ar);

    }



    protected void Page_PreRenderComplete(object sender, EventArgs e)

    {

        Output.DataSource = _reader;

        Output.DataBind();

    }



    public override void Dispose()

    {

        if (_connection != null) _connection.Close();

        base.Dispose();

    }

}

示例3:异步调用WebService

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;



public partial class AsyncWSInvoke1 : System.Web.UI.Page

{

    private WS.PubsWebService _ws;

    private DataSet _ds;



    protected void Page_Load(object sender, EventArgs e)

    {

        if (!IsPostBack)

        {

            // Hook PreRenderComplete event for data binding

            this.PreRenderComplete += 

                new EventHandler(Page_PreRenderComplete);



            // Register async methods

            AddOnPreRenderCompleteAsync(

                new BeginEventHandler(BeginAsyncOperation),

                new EndEventHandler(EndAsyncOperation)

            );

        }

    }



    IAsyncResult BeginAsyncOperation (object sender, EventArgs e, 

        AsyncCallback cb, object state)

    {

        _ws = new WS.PubsWebService();

        // Fix up URL for call to local VWD-hosted Web service

        _ws.Url = new Uri(Request.Url, "Pubs.asmx").ToString();

        _ws.UseDefaultCredentials = true;

        return _ws.BeginGetTitles (cb, state);

    }



    void EndAsyncOperation(IAsyncResult ar)

    {

        _ds = _ws.EndGetTitles(ar);

    }



    protected void Page_PreRenderComplete(object sender, EventArgs e)

    {

        Output.DataSource = _ds;

        Output.DataBind();

    }



    public override void Dispose()

    {

        if (_ws != null) _ws.Dispose();

        base.Dispose();

    }

}

示例4:还是异步调用WebService,但换了一种方法

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;



public partial class AsyncWSInvoke2 : System.Web.UI.Page

{

    private WS.PubsWebService _ws;

    private DataSet _ds;



    protected void Page_Load(object sender, EventArgs e)

    {

        if (!IsPostBack)

        {

            // Hook PreRenderComplete event for data binding

            this.PreRenderComplete += 

                new EventHandler(Page_PreRenderComplete);



            // Call the Web service asynchronously

            _ws = new WS.PubsWebService();

            _ws.GetTitlesCompleted += new 

                WS.GetTitlesCompletedEventHandler(GetTitlesCompleted);

            _ws.Url = new Uri(Request.Url, "Pubs.asmx").ToString();

            _ws.UseDefaultCredentials = true;

            _ws.GetTitlesAsync();

        }

    }



    void GetTitlesCompleted(Object source, 

        WS.GetTitlesCompletedEventArgs e)

    {

        _ds = e.Result;

    }



    protected void Page_PreRenderComplete(object sender, EventArgs e)

    {

        Output.DataSource = _ds;

        Output.DataBind();

    }



    public override void Dispose()

    {

        if (_ws != null) _ws.Dispose();

        base.Dispose();

    }

}

示例5:跟示例1差不多,但是加了TimeOut处理

using System;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Net;

using System.IO;

using System.Text;

using System.Text.RegularExpressions;



public partial class AsyncPageTask : System.Web.UI.Page

{

    private WebRequest _request;



    protected void Page_Load(object sender, EventArgs e)

    {

        PageAsyncTask task = new PageAsyncTask(

            new BeginEventHandler(BeginAsyncOperation),

            new EndEventHandler(EndAsyncOperation),

            new EndEventHandler(TimeoutAsyncOperation),

            null

        );

        RegisterAsyncTask(task);

    }



    IAsyncResult BeginAsyncOperation(object sender, EventArgs e, 

        AsyncCallback cb, object state)

    {

        _request = WebRequest.Create("http://msdn.microsoft.com");

        return _request.BeginGetResponse(cb, state);

    }



    void EndAsyncOperation(IAsyncResult ar)

    {

        string text;

        using (WebResponse response = _request.EndGetResponse(ar))

        {

            using (StreamReader reader = 

                new StreamReader(response.GetResponseStream()))

            {

                text = reader.ReadToEnd();

            }

        }



        Regex regex = new Regex("href\s*=\s*"([^"]*)"", 

            RegexOptions.IgnoreCase);

        MatchCollection matches = regex.Matches(text);



        StringBuilder builder = new StringBuilder(1024);

        foreach (Match match in matches)

        {

            builder.Append(match.Groups[1]);

            builder.Append("<br/>");

        }



        Output.Text = builder.ToString();

    }



    void TimeoutAsyncOperation(IAsyncResult ar)

    {

        Output.Text = "Data temporarily unavailable";

    }

}