从服务器端线程更新面板

时间:2013-03-09 10:31:40

标签: c# asp.net ajax multithreading updatepanel

我正在尝试使用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();。但小组没有更新。

问题是什么?

4 个答案:

答案 0 :(得分:1)

在ASP.Net中,您可以使用计时器控制和updatepanel。

<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与setTimeout函数异步调用Web服务。

答案 1 :(得分:0)

不是服务器主动将更改推送到客户端,而是尝试相反:让客户端主动查询服务器,并相应地更新其状态。

一种方法是创建一个按钮来手动查询服务器。验证它是否有效后,使用css隐藏按钮,并设置一个函数以定期单击按钮。您可以使用javascript setInterval

要点击javascript中的按钮,您可以执行以下操作:

setInterval(function(){ document.getElmtById(“<%= theButton.ClientID %>").click(); }, 2000);

上述代码应每2秒点击theButton

答案 2 :(得分:0)

你应该看看SignalR.net。 Jabbr.net基于signalR,正是您所需要的。 https://github.com/davidfowl/JabbR

答案 3 :(得分:0)

是Vishal ......可能不那么复杂:

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