我的界面上有1个按钮和两个TextBox,目的是想通过异步的方式给TextBox1赋值,TextBox2显示是否处理成功。
下面是我的代码,调试两个TextBox可以得到值,但界面的显示为空,请帮忙改一下,让界面也显示。public partial class Default3 : System.Web.UI.Page
{    private delegate bool AsyncMethodCaller();    protected void Page_Load(object sender, EventArgs e)
    {    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        AsyncMethodCaller caller = new AsyncMethodCaller(this.AssignText);
        IAsyncResult result = caller.BeginInvoke(new AsyncCallback(this.Callback), caller);
    }    private bool AssignText()
    {
        TextBox1.Text = "1";
        return true;
    }    private void Callback(IAsyncResult ar)
    {
        AsyncMethodCaller caller = (AsyncMethodCaller)ar.AsyncState;
        bool loginstate = (bool)caller.EndInvoke(ar);
        if (loginstate)
            TextBox2.Text = "成功";
        else
            TextBox2.Text = "失败";    }
}
其实,我们的项目要求是一项比较耗时间的操作通过异步来实现,想在系统处理这个操作的同时可以浏览系统别的页面。这个处理完成后提示用户已经完成,我就想到上面的方法,但是初涉异步编程,请大家说一下,是不是应该用上面的方法。

解决方案 »

  1.   

    现在CSDN怎么连个顶帖的人都没有了?
      

  2.   

    谢谢,不过我的是Web程序,上面那段代码,还有办法改吗?
      

  3.   

    我上面写的那段代码,跟你给的例子也很类似呀,错在哪里? 能不能给段web的给我? 或者给我改一下我上面的那段
      

  4.   

    public partial class ClientCallback : Page, ICallbackEventHandler
    {
        void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ClientScriptManager cm = Page.ClientScript;
                String cbReference = cm.GetCallbackEventReference(this, "args", "ReceiveServerData", "");
                String callbackScript = "function CallServer(args, context) {" + cbReference + "; }";
                cm.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true);
            }
        }    private string returnStr;    public void RaiseCallbackEvent(String eventArgument)
        {
            //do something with return argument
            returnStr = eventArgument.ToUpper();
            returnStr += "\n异步实现";
            //Response.Write(returnStr);
            return;
        }    //function that sends result?
        public string GetCallbackResult()
        {
            return returnStr;
        }
    }
      

  5.   

    ASP.NET整个流水线就支持异步操作,但对于客户端来讲,总是处于等待回应的状态。Server端可以异步地处理较为缓慢的操作,以加快IIS线程池的利用率,提高综合性能。
      

  6.   

    To:Ninputer 我上面的那段代码能改吗? 
      

  7.   

    ASP.NET整个流水线就支持异步操作,但对于客户端来讲,总是处于等待回应的状态。Server端可以异步地处理较为缓慢的操作,以加快IIS线程池的利用率,提高综合性能。
    ------------------------------------------------
    Server端可以异步地处理较为缓慢的操作,     怎么实现,我上面的代码就是想把AssignText作为那个缓慢的操作,为什么实现不了
      

  8.   

    我把整个测试的代码发出来,大家帮忙看一下改怎么改?
    HTML:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
            <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox></div>
        </form>
    </body>
    </html>
    .cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    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; public partial class Default3 : System.Web.UI.Page
    {    private delegate bool AsyncMethodCaller();    protected void Page_Load(object sender, EventArgs e)
        {    }
        protected void Button1_Click(object sender, EventArgs e)
        {
            AsyncMethodCaller caller = new AsyncMethodCaller(this.AssignText);
            IAsyncResult result = caller.BeginInvoke(new AsyncCallback(this.Callback), caller);
        }    private bool AssignText()
        {
            TextBox1.Text = "1";
            return true;
        }    private void Callback(IAsyncResult ar)
        {
            AsyncMethodCaller caller = (AsyncMethodCaller)ar.AsyncState;
            bool loginstate = (bool)caller.EndInvoke(ar);
            if (loginstate)
                TextBox2.Text = "成功";
            else
                TextBox2.Text = "失败"; 
        }
    }
      

  9.   

    TO:youngerch 不好意思,我看不太懂
      

  10.   

    asp.net要在页面render之前把所有和界面有关的异步都等待结束,否则,只会修改Server端的对象,Client端的html将不会有变化(Server都把html发送给client了,怎么修改?要是能修改,就可以直接把Ajax扔掉了)
    还有,所有的BeginInvoke要有对应的EndInvoke(当然也可以放在Callback里面)