0

我有一个 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 方法中。更新面板如下所示:

<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 很陌生。

4

3 回答 3

4

晚了一点,但您可以通过在 UpdatePanel 中实现一个 Timer 对象来解决此问题,然后使用计时器“OnTick”事件来更新标签。然后,您可以通过将所需的值输出到全局变量和/或使用静态实现来重新设计您的 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();
}
于 2013-03-04T14:47:09.320 回答
3

您还没有完全理解 Ajax 和 UpdatePanel 的工作方式。

实际上,UpdatePanel,从客户端,通过发布请求从服务器请求数据,然后等待获取它们,在获取数据之后更新客户端。浏览器必须发出请求以获取数据 - 服务器不能向浏览器发送任何数据,而无需首先浏览器请求它们。

该命令updatePanel.Update();的含义是在发布后的代码上通知 UpdatePanel 有更新 - 并且不像您想象的那样工作,并不是因为您调用它而将数据发送到 UpdatePanel。

即使您在发布后进行这样的关闭循环,UpdatePanel 也会等待连接完全完成并关闭以显示数据,因此这样的线程中的循环无法建立连接以发送数据。

为了让你的想法奏效,以太在客户端创建一个计时器,每隔一段时间询问一次数据,以太的彗星技术:Reverse AJAX with IIS/ASP.NET

于 2012-09-20T10:04:12.417 回答
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" />
于 2012-09-20T10:04:18.427 回答