从服务器端线程更新面板

本文关键字:更新 线程 服务器端 | 更新日期: 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隐藏按钮,并设置一个函数以定期间隔单击按钮。您可以使用javascript setInterval

在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;
}