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

急,急~~做程序遇到的一个比较奇怪的问题,急需解决!请各位高手帮忙啊

在asp.net(C#)中,有一个按钮

 protected void Button1_Click(object sender, EventArgs e)

{
this.Label.Text="运行中......";

running();  //说明:running()是自己定义的一个函数,它的响应时间较长,打个比方,它

就是一个发邮件(带了很大附件)的函数
this.Label.Text="运行完毕";
}

我要的效果是当点击这个Button1的时候,Label显示的是“运行中......”,但当过了一段时间,也就是

running()函数运行完毕了,Label才显示的是“运行完毕”。

但现在实际上是当我点击了Button1的时候,程序是在运行了一段时间后,Label直接显示“运行完毕”,并

没有先显示“运行中......”,等running函数运行完了再显示“运行完毕”。

请问这是怎么回事,如果要达到我要的效果要怎么做?
--------------------编程问答-------------------- 异步执行一个方法.
BeginXxx(method)
EndXxx() --------------------编程问答-------------------- running 定义成布尔型的,结束后返回true;再判断
if(running())
{
this.Label.Text="运行完毕"; 
} --------------------编程问答-------------------- 用js可以实现你要的效果.button onclick或onfocus的时候让Label显示“运行中......”,
running()之后让Label显示"运行完毕";

另外用多线程的方法也可以实现.web中没用过,理论上可以,但是不推荐,个人感觉不适合web中 --------------------编程问答-------------------- 这个应该跟页面的生命周期有关系吧,还是先了解页面执行的先后顺序.label的text赋值都在一个回发里执行,最后显示的应该是最后的那个. --------------------编程问答-------------------- 用Thread吧. --------------------编程问答-------------------- 谢谢各位的回答,但我还是不太清楚,还有lihongdian说的异步执行一个方法. 具体要怎么操作啊? --------------------编程问答-------------------- 如果涉及到比较耗时的操作,微软推荐的是异步方法.自己查书解决是好的习惯 --------------------编程问答-------------------- 首先,这段代码是在服务器端执行的
其次,服务器端执行完毕以后会将执行完毕的结果发送给客户端


因此,你得到的只是”执行完毕“这个提示
--------------------编程问答-------------------- 还是使用异步吧,不然没法准确的做到真正的执行完毕后的提示 --------------------编程问答-------------------- 用AJAX中的UpdateProgress控件结合UpdatePanel控件就可以实现那样的效果 --------------------编程问答--------------------
引用 10 楼 wokaokikj 的回复:
用AJAX中的UpdateProgress控件结合UpdatePanel控件就可以实现那样的效果

用现成的吧,很方便的
多线程异步执行是在winform里面使用的。 --------------------编程问答-------------------- PetShop看过吗
那里面有个消息队列的处理就用到了异步

其实也没什么,在处理的时候用多个线程,一个一个的打开,没打开一个线程处理一些事务

异步的例子,你看看吧

        static void Main(string[] args)
        {
            Thread workTicketThread;
            Thread[] workerThreads = new Thread[3];

            for (int i = 0; i < 3; i++)
            {
                workTicketThread = new Thread(new ThreadStart(Operate));
                // Make this a background thread, so it will terminate when the main thread/process is de-activated
                workTicketThread.IsBackground = true;
                workTicketThread.SetApartmentState(ApartmentState.STA);
                // Start the Work
                workTicketThread.Start();
                workerThreads[i] = workTicketThread;
            }
        }

        private static void Operate()
        {
            while (true)
            {
                int a = 0;
                for (int i = 0; i < 1000000; i++)
                {
                    for (int j = 0; j < 200000; j++)
                    {
                        a = a + i + j;
                    }
                }
            }
        } --------------------编程问答-------------------- 跟线程和异步没有关系,这是客户端显示的,老大。

我觉得有两种方法,第一是,先发送一个简单的页面过去,这个页面什么都没有,只在上面title 是“执行中...”;然后等执行完毕,再刷新一下Page_Load就OK。
第二个就比较麻烦,要用客户端的工具,Ajax。它不断的检测你设置的一个开关量,直到执行完毕,这个开关量为true 了,你再把title 显示为“执行完毕”。但是我觉得这完全没有必要,太麻烦,因为可能还需要做一个webservice。

不知道我说的对不对。 --------------------编程问答-------------------- 异步方法是程序使用的进程,在到达异步点的时候,这个进程被释放掉,然后进程变成一个闲置的进程可以用来服务别的请求,同时异步方易做图在一个自己的线程上执行,这个线程会与进程池使用一个回调函数保持联系,等待异步方法执行完毕的时候,这个回调函数会告诉进程池,使用当时空闲的进程(这个进程可能与当前的进程不是一个)来服务这个请求继续进行,一直到结束;

搂主没有实现的那个效果的原因是因为 虽然你在 protected void Button1_Click(object sender, EventArgs e) 


this.Label.Text="运行中......"; 
这设置了 text属性,但是这个方法还没有执行完毕,也就是.net的生命周期的render方法还没有执行,页面是不会更新的;当你的Button1_Click方法执行完毕后,render方法才会执行,所以你的Label.Text根本就不可能出现你要的效果;

如果要实现搂主的效果,必须使用ajax,这是ajax最典型的应用 --局部更新

这也是ajax最基础的效果,也是ajax入门的例子;你可以baidu一下

非常简单

不知道是否说清楚了 --------------------编程问答-------------------- public partial class Email : System.Web.UI.Page,ICallbackEventHandler  //首先页面要继承这个接口,实现他的两个方法 如下 
{
    public string s;
    protected void Page_Load(object sender, EventArgs e)
    {
       if (!IsPostBack)
        {
          
//注册一个用来处理回发数据的javascript函数 getCallBackResult这个函数用来设置 lable控件的text=运行完毕
            ClientScript.RegisterClientScriptBlock(this.GetType(), "jsRegisterName", "function getCallBackResult(response,context){document.getElementById(\"t\").value=response}", true);
            
            //注册一个回发的操作
            string js = "document.getElementById(\"t\").value=\"运行中\"";
            string arp = ClientScript.GetCallbackEventReference(this, "\"啊啊aaa\"", "getCallBackResult", js, false);//getCallBackResult是接受挥发操作返回数据的javascript
            string fun = "function DoBack(){ " + arp + ";}"; //是触发回发操作的javascript脚本
            ClientScript.RegisterClientScriptBlock(this.GetType(), "DoBack", fun, true);//DoBack也是js的注册的名字 无实际的意义
            
            //回发操作的触发和回发控件绑定 下面这个控件就是使用你触发发邮件的控件,你可以直接放在页面上,最好是html控件然后设置runat=server属性,
            HtmlButton b = new HtmlButton();
            b.InnerText = "CallBackButton";
            b.Attributes["onclick"] = "javascript:DoBack()";
            this.form1.Controls.Add(b);

        }
    }

    /// <summary>
    /// 要想脚本回发操作成功 必须实现以下的接口事件
    /// </summary>
    #region ICallbackEventHandler 成员
    private string text;
    /// <summary>
    /// 把数据传递给页面注册的js函数
    /// </summary>
    /// <returns></returns>
    string ICallbackEventHandler.GetCallbackResult()
    {
        run();
        return text;
    }  
    /// <summary>
    /// 处理回发操作的请求
    /// </summary>
    /// <param name="eventArgument"></param>
    void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
    {
        text="运行完毕";
    }
这个办法验证通过,是我没使用ajax实现的
有不明白的发邮件问我
haonanq20015921@163.com
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,