我正在尝试使用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();
。但小组没有更新。
问题是什么?
答案 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;
}