当前位置:编程学习 > C#/ASP.NET >>

ado.net使用回调方式处理异步进程,到底哪里出错了?

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.Sql;
using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            FillGridViewByCallback();
        }
    }

    public void FillGridViewByCallback()
    {
        string connString = "Database=Northwind;Server=.;User Id=sa;Password=;Asynchronous Processing=true;MultipleActiveResultSets=True";
        SqlConnection connNorthwind = new SqlConnection(connString);
        SqlCommand commProducts = new SqlCommand("select * from Products", connNorthwind);
        SqlCommand ordersComm = new SqlCommand("select * from orders", connNorthwind);
        connNorthwind.Open();
        commProducts.BeginExecuteReader(new AsyncCallback(productsCallbackMethod), commProducts, CommandBehavior.CloseConnection);
        ordersComm.BeginExecuteReader(new AsyncCallback(ordersCallbackMethod), ordersComm, CommandBehavior.CloseConnection);
        connNorthwind.Close();
    }

    public void productsCallbackMethod(IAsyncResult ar)
    {
        SqlCommand commProducts = ar.AsyncState as SqlCommand;
        SqlDataReader productsReader = commProducts.EndExecuteReader(ar);
        gvProducts.DataSource = productsReader;
        gvProducts.DataBind();
    }

    public void ordersCallbackMethod(IAsyncResult ar)
    {
        SqlCommand commOrders = ar.AsyncState as SqlCommand;
        SqlDataReader ordersReader = commOrders.EndExecuteReader(ar);
        gvOrders.DataSource = ordersReader;
        gvOrders.DataBind();
    } 
}

程序执行无任何显示,并出现异步操作已完成。请大虾们帮忙,感谢!

--------------------编程问答-------------------- 你可以用xmlhttp处理异步的,挺简单的..
--------------------编程问答-------------------- msdn.microsoft.com/msdnmag/issues/07/08/CuttingEdge/default.aspx --------------------编程问答-------------------- b/s程序服务器端不适合用异步处理或多线程

--------------------编程问答-------------------- o --------------------编程问答-------------------- xmlhttp --------------------编程问答-------------------- 2楼的朋友,为何不适合呀?  --------------------编程问答-------------------- 我知道可以使用其它的异步方法实现,但我就想知道这种方法到底哪里有问题?asp.net2.0高级编程中有谈到这种方法,可根本不能实现,真搞不明白? --------------------编程问答-------------------- B/S程序是请求应答形式,客户端请求,服务器段接受请求,返回结果,程序结束,不会等你的异步调用返回
除非你阻塞住服务器的线程 --------------------编程问答-------------------- b/s的程序。异步本身就是个问题啊。还要和服务器请求的确比较怪

web程序都是客户和服务器请求,服务器才发送结果。服务器不会主动给客户端发送东西。我的理解 --------------------编程问答-------------------- ASP.NET默认不支持这样的多线程,因为处理情景如下:
请求来到IIS,IIS从线程池取一个线程处理请求,该线程进入ASP.NET调用,一直以单线程方式处理到完成响应生成,并退出ASP.NET调用,然后结束线程。

然而你现在加入了另外一个线程,事情变成了:
单线程处理过程中另外创建了一个线程,但是处理线程不阻塞,继续处理,数据调用线程还没有返回并进行数据绑定,处理线程就已经跑到呈现页面那一步了,呈现好了页面处理线程就下班了。之后,数据调用线程才跑回来说,它已经得到数据了,然后这时候Page都已经销毁了,绑定给谁?

因此你必须引入一种机制,当处理线程跑到呈现阶段时,先停住,等别的线程都返回了才进行呈现。你需要的就是ASP.NET 2.0的Asycn Page,搜索一下这个名称你就能得到若干文章,告诉你如何在Page中注册其他线程的调用,以确保处理线程会等待它们返回。 --------------------编程问答-------------------- 晚上怎么这么卡

学习了

必须使用异步页面了
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,