3

aspxを使用してチャットを開発しようとしています。すでにasmx+winformで動作するようになりましたが、asmx+aspxで問題が発生しました。

基本的に私がやりたいのは、CheckForMessages2秒ごとに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では、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>

そしてコードで-あなたの後ろで次のようにコーディングします:

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

これはあなたのために働くはずです。ただし、JavaScriptとJQueryを使用して、setTimeout関数を使用してWebサービスを非同期的に呼び出すことをお勧めします。

于 2013-03-09T11:26:35.353 に答える
0

サーバーがアクティブに変更をクライアントにプッシュする代わりに、反対のことを試してください。クライアントにサーバーにアクティブにクエリを実行させ、それに応じて状態を更新します。

そのための1つの方法は、サーバーに手動でクエリを実行するためのボタンを作成することです。動作確認後、cssでボタンを非表示にし、一定間隔でボタンをクリックする機能を設定します。これにはjavascriptsetIntervalを使用できます。

javascriptのボタンをクリックするには、次のようにします。

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

上記のコードはtheButton2秒ごとにクリックする必要があります。

于 2013-03-09T10:48:32.200 に答える
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 に答える