现在的位置: 首页 > 综合 > 正文

MS WEB异步页示例疑问???

2012年11月15日 ⁄ 综合 ⁄ 共 1774字 ⁄ 字号 评论关闭

在MSDN看了MS的ASP.NET 2.0 中的异步页文章,其中试了一下运行效果。发觉其根本没有达到界面效果(异步功能是实现了).

http://www.microsoft.com/china/msdn/library/webservices/asp.net/issuesWickedCodetoc.mspx

 

数据访问代码如下.

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);
            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();
    }
}

 原理不讲了,看MS的帮助就行了。讲一下问题,上面红色的一段在运行时会调用二次。就是因为此二次调用,造成界面数据无法显示:因为_reader中的数据在第一次调用时已全部读取了。指针到最后,第二次调用就会为null.

不明白的就是Page_PreRenderComplete 为什么会调用二次。没办法,只好变通一下。用一个标记来判断是否要进行绑定.代码改成如下就可以正常显示:

 bool _isread = false;
    protected void Page_PreRenderComplete(object sender, EventArgs e)
    {
       if(_isread==false)
       {
            this.GridView1.DataSource = _reader;
            GridView1.DataBind();
            _isread = true;
        }
    }

抱歉!评论已关闭.