0

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

4

1 回答 1

0

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

您可以在这里使用一些技术:

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

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

为此,您可以使用 jQuery 和 ASP.NET Web 服务,就像这里解释的那样。

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

于 2012-05-25T00:12:47.547 回答