在我的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
时都尝试创建一个新标签。但我的尝试似乎都没有任何区别。任何帮助将不胜感激。
答案 0 :(得分:0)
在ASP.NET中,当浏览器请求页面时,服务器启动一个线程来呈现页面并将其发送回浏览器。呈现页面后,线程结束,所有相关的后台工作程序也完成。此页面将被发送回浏览器。因此,除非您明确等到后台工作程序完成,否则它将永远不会完成并更新页面内容。
你可以在这里使用一些技巧:
但是,如果您的后台工作人员需要很长时间才能执行,因为在线程完成之前页面不会发送到浏览器,您可以在浏览器中获得超时或无响应的页面。
为避免这种情况,您可以使用AJAX和Web服务:在Web服务方法中公开后台工作程序的功能,并使用AJAX执行此方法。完成此方法后,您可以直接在浏览器中更新标签。发生这种情况时,浏览器仍然响应。
为此你可以使用jQuery和ASP.NEt网络服务,就像解释here一样。
最后,您永远不应该在ASP.NET中运行一个非常长的进程:服务器不时地循环(重新启动)应用程序,这可以突然停止执行您的Web服务方法。