3

我正在尝试使用 aspx 开发聊天。我已经让它与 asmx + winform 一起使用,但现在我遇到了 asmx + aspx 的问题。

基本上我想要做的是CheckForMessages每两秒调用一次 WebMethod,如果有消息,将它们添加到更新面板内的列表框中并执行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

4 回答 4

1

在 ASP.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>

在代码隐藏中,您可以编写如下代码:

public string GetMessageLog()
{
    string message = CheckForMessages();
    if (message != "") {
      ListBox1.Items.Add(message);      
    return DateTime.Now.ToLongTimeString();
}

这应该适合你。但我会推荐你​​使用 Javascript 和 JQuery 来通过 setTimeout 函数异步调用 Web-Service。

于 2013-03-09T11:26:35.353 回答
0

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

于 2013-03-09T12:56:44.610 回答
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;
}
于 2014-07-16T17:01:14.137 回答
0

与其服务器主动向客户端推送更改,不如尝试相反的做法:让客户端主动查询服务器,并相应地更新其状态。

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

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

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

上面的代码应该theButton每 2 秒点击一次。

于 2013-03-09T10:48:32.200 回答