我有一个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的新手。
答案 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" />