急,急~~做程序遇到的一个比较奇怪的问题,急需解决!请各位高手帮忙啊
在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控件就可以实现那样的效果 --------------------编程问答--------------------
用现成的吧,很方便的
多线程异步执行是在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