正在处理类时更新asp:Label

时间:2012-04-10 18:21:00

标签: c# asp.net multithreading client-side

我有以下aspx页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="index" %>

<!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></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="lblStatus" runat="server" Text="Label">
        </asp:Label><asp:Button ID="btnRun" runat="server" Text="Button" onclick="btnRun_Click" />
    </div>
    </form>
</body>
</html>

代码隐藏是:

public partial class index : System.Web.UI.Page
{
    protected void btnRun_Click(object sender, EventArgs e)
    {
        CP CPObj = new CP();
        lblStatus.Text = "Starting process..";

        CPObj.run();
        lblStatus.Text = "Process done.";
    }
}

班级需要做一些工作(大约一分钟)。 单击按钮时,标签不会更改,只有在类完成作业后,标签才会更改为“已完成处理”。

我已经找了很长时间的解决方案,但找不到明确而直截了当的答案。

我试图将该类作为一个线程运行并获得相同的结果。

public partial class index : System.Web.UI.Page
{
    protected void btnRun_Click(object sender, EventArgs e)
    {
        CP CPObj = new CP();
        Thread oThread = new Thread(new ThreadStart(CPObj.run));

        lblStatus.Text = "Starting process..";

        oThread.Start();

        while (!oThread.IsAlive) ;
        while (oThread.IsAlive)
        {
            Thread.Sleep(1000);
        }

        lblStatus.Text = "Process done.";
    }
}

使用JavaScript似乎有问题,因为我已经有一个onClick调用(不确定我在这里是否正确)。

我真的很感激回应。

谢谢! Nadav

2 个答案:

答案 0 :(得分:1)

网页与传统的网页形式不同。

您无法将标签设置为某个值,然后在同一个回调中将该值更改为其他值并同时显示。

你需要做的是使用一些ajax。简单的方法是添加更新面板并走这条路线。基本上,您可以通过javascript将标签设置为“启动过程...”,然后让面板在回调完成后更改标签。

或者,可以在没有ajax的情况下执行此操作;但是你再次通过一些javascript设置标签。然后让你的回调例程写下来。

答案 1 :(得分:0)

我认为您需要了解页面生命周期。很高兴您正在更新您的标签,但由于这是Web,因此在所有代码运行之前,您的数据将不会返回浏览器。因此,您无法更新尚未发送到浏览器的页面上尚未存在的标签;)

我认为JS是您的解决方案(不是该领域的专家)或者可能是一些将查询进程运行时的ajax,以及在另一个线程上运行的进程?