从服务器端线程更新面板
本文关键字:更新 线程 服务器端 | 更新日期: 2023-09-27 18:03:00
我正在尝试使用aspx开发聊天。我已经得到它与asmx + winform工作,但现在我有asmx + aspx的问题。
基本上我想做的是每两秒钟调用WebMethod CheckForMessages
,如果有消息,将它们添加到更新面板中的列表框中,并执行UpdatePanel1.Update();
。
问题是,显然我不能做到这一点使用线程像我在我的winform。
void check() {
while (true) {
Thread.Sleep(2000);
string message = CheckForMessages();
if (message != "") {
ListBox1.Items.Add(message);
UpdatePanel1.Update();
}
}
}
我像这样开始这个线程:
protected void Page_Load(object sender, EventArgs e) {
timer = new Thread(new ThreadStart(check));
timer.Start();
}
它不会抛出异常或任何东西,程序按预期运行。调用web服务,如果有消息则返回字符串,线程将消息添加到列表中并调用UpdatePanel1.Update();
。然而,面板没有更新。
Net中,你可以使用计时器控制和更新面板。
<asp:UpdatePanel runat="server" ID="uxUpdatePanel" UpdateMode="Conditional" EnableViewState="true">
<ContentTemplate>
<div>
<asp:Label ID="Label1" runat="server" style="display:none;"><%=GetMessageLog()%></asp:Label>
<asp:ListBox runat="server" ID="ListBox1" EnableViewState="true">
</asp:ListBox>
</div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="uxTimer" EventName="Tick" />
</Triggers>
</asp:UpdatePanel>
<asp:Timer runat="server" ID="uxTimer" Interval="2000">
</asp:Timer>
和code -behind你的代码如下:
public string GetMessageLog()
{
string message = CheckForMessages();
if (message != "") {
ListBox1.Items.Add(message);
return DateTime.Now.ToLongTimeString();
}
这应该对你有用。但我建议您使用Javascript和JQuery来异步调用Web-Service与setTimeout函数。
与其让服务器主动向客户端推送更改,不如尝试相反的方法:让客户端主动查询服务器,并相应地更新其状态
一种方法是创建一个按钮来手动查询服务器。在验证其工作后,使用css隐藏按钮,并设置一个函数以定期间隔单击按钮。您可以使用javascriptsetInterval
。
在javascript中点击一个按钮,你可以这样做:
setInterval(function(){ document.getElmtById(“<%= theButton.ClientID %>").click(); }, 2000);
上面的代码应该每2秒点击一次theButton
。
你应该看看SignalR.net。Jabbr.net是基于signalR的,正是你所需要的。https://github.com/davidfowl/JabbR
是…也许不那么复杂:
<asp:UpdatePanel ID="updatePanelPromptB" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="labelPlayback" runat="server"></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="timerPromptB" EventName="Tick" />
</Triggers>
</asp:UpdatePanel>
<asp:Timer runat="server" ID="timerPromptB" OnTick="timerPromptB_Tick" Enabled="false" Interval="4000" />
private void promptBottom(string text)
{
labelPlayback.Text = text;
updatePanelPromptB.Update();
timerPromptB.Enabled = true;
}
protected void timerPromptB_Tick(object sender, EventArgs e)
{
labelPlayback.Text = "OK";
timerPromptB.Enabled = false;
}