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