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

weixing06 2008-04-03 09:26:36
在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函数运行完了再显示“运行完毕”。

请问这是怎么回事,如果要达到我要的效果要怎么做?
...全文
91 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
7仔 2008-04-03
  • 打赏
  • 举报
回复
异步方法是程序使用的进程,在到达异步点的时候,这个进程被释放掉,然后进程变成一个闲置的进程可以用来服务别的请求,同时异步方法会在一个自己的线程上执行,这个线程会与进程池使用一个回调函数保持联系,等待异步方法执行完毕的时候,这个回调函数会告诉进程池,使用当时空闲的进程(这个进程可能与当前的进程不是一个)来服务这个请求继续进行,一直到结束;

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

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

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

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

非常简单

不知道是否说清楚了
Kjte__Boy 2008-04-03
  • 打赏
  • 举报
回复
跟线程和异步没有关系,这是客户端显示的,老大。

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

不知道我说的对不对。
JL99000 2008-04-03
  • 打赏
  • 举报
回复
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;
}
}
}
}
virusswb 2008-04-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wokaokikj 的回复:]
用AJAX中的UpdateProgress控件结合UpdatePanel控件就可以实现那样的效果
[/Quote]
用现成的吧,很方便的
多线程异步执行是在winform里面使用的。
wokaokikj 2008-04-03
  • 打赏
  • 举报
回复
用AJAX中的UpdateProgress控件结合UpdatePanel控件就可以实现那样的效果
shouzheng 2008-04-03
  • 打赏
  • 举报
回复
还是使用异步吧,不然没法准确的做到真正的执行完毕后的提示
JL99000 2008-04-03
  • 打赏
  • 举报
回复
首先,这段代码是在服务器端执行的
其次,服务器端执行完毕以后会将执行完毕的结果发送给客户端


因此,你得到的只是”执行完毕“这个提示
lihongdian 2008-04-03
  • 打赏
  • 举报
回复
如果涉及到比较耗时的操作,微软推荐的是异步方法.自己查书解决是好的习惯
weixing06 2008-04-03
  • 打赏
  • 举报
回复
谢谢各位的回答,但我还是不太清楚,还有lihongdian说的异步执行一个方法. 具体要怎么操作啊?
huaer1011 2008-04-03
  • 打赏
  • 举报
回复
用Thread吧.
glsym 2008-04-03
  • 打赏
  • 举报
回复
这个应该跟页面的生命周期有关系吧,还是先了解页面执行的先后顺序.label的text赋值都在一个回发里执行,最后显示的应该是最后的那个.
满衣兄 2008-04-03
  • 打赏
  • 举报
回复
用js可以实现你要的效果.button onclick或onfocus的时候让Label显示“运行中......”,
running()之后让Label显示"运行完毕";

另外用多线程的方法也可以实现.web中没用过,理论上可以,但是不推荐,个人感觉不适合web中
BernardSun 2008-04-03
  • 打赏
  • 举报
回复
running 定义成布尔型的,结束后返回true;再判断
if(running())
{
this.Label.Text="运行完毕";
}
lihongdian 2008-04-03
  • 打赏
  • 举报
回复
异步执行一个方法.
BeginXxx(method)
EndXxx()
7仔 2008-04-03
  • 打赏
  • 举报
回复
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

62,039

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧