无法从线程事件更新 System.Web.UI.WebControls.Label 的文本

本文关键字:WebControls UI Label 文本 Web System 线程 事件 更新 | 更新日期: 2023-09-27 18:35:12

在我的C#ASP.NET 项目中,我有一个后台线程可以执行一些处理。 我想向用户显示后台进程何时开始和何时结束。 为此,在后台代码中,我得到了:

public static void RefreshNavigationElements()
{
    TimeInfoEventArgs timeInformation = new TimeInfoEventArgs("WPALoading has started");
    WorkProductAgreements.OnSecondChange(timeInformation);
    WPA_Supers.Clear();
    PopulateWPAs();
    timeInformation.myMessage = "WPALoading has ended";
    WorkProductAgreements.OnSecondChange(timeInformation);
}

侦听事件的代码:

public void TimeHasChanged(TimeInfoEventArgs ti)
{
    Label11.Text = ti.myMessage;
    System.Diagnostics.Debug.WriteLine(ti.myMessage);
}

调试器中单步执行操作表明,TimeHasChanged函数在适当的时间被调用,ti 中的文本正确。 Debug.WriteLine命令输出正确的消息。 但是页面上的Label11文本不会更改。

在我对事物不太深入的理解中,我认为我只需要触发页面刷新或类似的东西,但我一辈子都无法弄清楚如何做到这一点。

我试过将Label放在UpdatePanel内. 我尝试在每次调用TimeHasChanged时创建一个新标签。 但我的所有尝试似乎都没有产生任何影响。 任何帮助将不胜感激。

无法从线程事件更新 System.Web.UI.WebControls.Label 的文本

在 ASP.NET 中,当浏览器请求页面时,服务器会启动一个线程来呈现页面并将其发送回浏览器。呈现页面后,线程完成,所有相关的后台工作线程也已完成。此时,页面将按原样发送回浏览器。因此,除非您明确等待后台工作线程完成,否则它将永远不会完成并更新页面内容。

您可以在此处使用一些技术:

  • ASP.NET 2.0 中的异步页面

但是,如果您的后台工作线程需要很长时间才能执行,因为页面在线程完成之前不会发送到浏览器,您可能会在浏览器中获得超时或无响应的页面。

若要避免这种情况,可以使用 AJAX 和 Web 服务

:在 Web 服务方法中公开后台工作进程的功能,并使用 AJAX 执行此方法。此方法完成后,您可以直接在浏览器中更新标签。发生这种情况时,浏览器仍然响应。

为此,您可以使用jQuery和 ASP.NEt Web服务,如此处所述。

最后,您永远不应该在 ASP.NET 中运行一个非常长的进程:服务器会不时回收(重新启动)应用程序,这可能会突然停止 Web 服务方法的执行。