asp.net UpdatePanel不会更新

时间:2012-09-20 09:53:18

标签: asp.net updatepanel

我有一个asp.net网站,其中包含一个从WCF服务获取一些数据的线程。该线程在无限循环中运行,等待每次运行1秒。现在我想在标签中显示从WCF服务获得的内容。我将该标签添加到UpdatePanel并调用.Update()方法。我没有任何例外,但标签根本没有更新。这是我的代码(简化):

t = new Thread(new ThreadStart(() =>
{
   while (true)
   {
      Label1.Text = GetFromWCF() + " " + DateTime.Now.ToString();
      updatePanel.Update();
      Thread.Sleep(1000);
   }
}
));

t.IsBackground = true;
t.Start();

此代码位于页面的OnInit方法中。 updatePanel如下所示:

<asp:ScriptManager runat="server" ID="scriptManager" EnablePartialRendering="true"/>
<asp:UpdatePanel runat="server" ID="updatePanel" UpdateMode="Conditional">
   <ContentTemplate>
      <asp:Label ID="Label1" runat="server" />
   </ContentTemplate>
</asp:UpdatePanel>

我错过了什么吗?也许我也应该告诉你我是asp.net的新手。

3 个答案:

答案 0 :(得分:3)

您并不完全了解Ajax和UpdatePanel的工作方式。

实际上,UpdatePanel,从客户端,通过发出一个post请求从服务器数据询问,然后等待获取它们,之后获取数据是更新客户端。浏览器必须发出获取数据的请求 - 服务器无法向浏览器发送任何数据,而第一个浏览器请求它们。

命令updatePanel.Update();具有通知UpdatePanel有关更新的意思,在帖子后面的代码后面 - 并且没有像你想象的那样工作,因为你没有将数据发送到UpdatePanel

即使你在帖子之后做了一个关闭循环,UpdatePanel也会等待连接完全完成并关闭以显示数据,因此这样的线程中的循环无法建立连接以发送数据。 / p>

为了让你的想法发挥作用,以太在客户端创建一个计时器,每隔一段时间就要求数据,以太彗星技术:Reverse AJAX with IIS/ASP.NET

答案 1 :(得分:3)

派对迟到了,但您可以通过在UpdatePanel中实现Timer对象,然后使用计时器“OnTick”事件更新Label来解决此问题。然后,您可以通过将所需的值输出到全局变量和/或使用静态实现来重写Thread函数。

<asp:UpdatePanel ID="MyPanel" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
    <asp:Timer ID="MyTimer" OnTick="timer_tick" Interval="1000" runat="server" />
    <asp:Label ID="UpdateTextBox" Text="start" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

protected void timer_tick(object sender, EventArgs e)
{
    UpdateTextBox.Text = Convert.ToString(myThreadClass.counter);
    MyPanel.Update();
}

答案 2 :(得分:2)

尝试使用触发器。

<asp:UpdatePanel runat="server" ID="update" UpdateMode="Conditional">
     <ContentTemplate>
         <asp:Label runat="server" ID="uiTime" />
         <asp:Button runat="server" ID="uiInternalButton" Text="Click" />
     </ContentTemplate>
     <Triggers>
         <asp:AsyncPostBackTrigger ControlID="uiAsynch" EventName="click" />
         <asp:PostBackTrigger ControlID="uiInternalButton" />
     </Triggers>
</asp:UpdatePanel>
<asp:Button runat="server" ID="uiPostback" Text="Click" />