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

时间:2012-05-24 23:43:23

标签: c# asp.net multithreading

在我的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时都尝试创建一个新标签。但我的尝试似乎都没有任何区别。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

你可以在这里使用一些技巧:

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

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

为此你可以使用jQuery和ASP.NEt网络服务,就像解释here一样。

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