gpt4 book ai didi

c# - 长轮询停止其他请求 1 或 2 分钟

转载 作者:行者123 更新时间:2023-11-30 21:05:17 26 4
gpt4 key购买 nike

在创建聊天系统的过程中,我使用长生命周期请求获取消息,并使用 jquery 请求发送消息,如下所示:

*发送:*

$("#btn").click(function () { 
$.ajax({
type: "POST",
url: "Chat.aspx/Insert",
data: "{ 'Str' :'" + $("#txtStr").val() + "' }",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
},
error: function () {

}
});
});

接收:

function Refresh() {

$.ajax({
type: "POST",
url: "Chat.aspx/GetRecords",
data: "{ 'Id' : " + $("#hdnV1").val() + "}",
success: function (data) {

$.each($(data.d), function () {

//Show it to user

});

},
complete: function () {
return Refresh();
},

contentType: "application/json; charset=utf-8",
dataType: "json",
traditional: true,
async: true
});

}

这是我获取消息的服务器端代码:

[WebMethod]
public static object GetRecords(int Id)
{
TestEntities db = new TestEntities();
int count = 0;
while (true)
{
if (count++ >= 300)
return null;


System.Threading.Thread.Sleep(1000);
var list = db.Commets.Where(rec => rec.Id > Id).Select(rec => new { Id = rec.Id, Str = rec.Str }).ToList();

if (list.Count > 0)
return list;

}
}

当用户写下一些东西并点击发送按钮时,请求进入挂起状态,我认为这是因为长生命周期请求正在执行

我在 firebug 中检查了它们,有没有人可以帮助我!?!有关更多详细信息,请评论我,抱歉我的英语语法不好,我是英语新手

谢谢

最佳答案

这不是在 asp.net 中建立聊天的最佳方法。随着用户数量的增加,此方法将无法扩展。

看看SignalR是构建聊天应用程序的不错选择。

但是,如果您出于某种原因确实想自己做,在 asp.net 中建立聊天的最有效方法是使用 IHttpAsyncHandler和 ajax 请求。

Asp.net 的工作线程数量有限。让其中之一休眠只会杀死您的应用程序,即使对于相对较少的用户也是如此。

异步请求允许您延迟请求的响应,直到发生外部事件。
用户调用此处理程序并等待有人向他发送消息。
将消息发送给用户后,消息会立即送达。

客户端在收到消息后发出另一个请求并等待下一条消息。这就是保持持久连接打开并允许服务器将数据推送到客户端的方式。

这比轮询站点以检查消息是否已到达要高效得多。
使用异步处理程序还可以确保在用户等待消息到来时不会浪费任何 asp.net 线程。使用计时器进行轮询,您将很快耗尽线程来处理 asp.net 中的请求。

这确保即使网站用户数量增加,您的聊天也能很好地扩展。

这是一个completely working project that implements this , 以及 ajax。

避免使用数据库作为站点用户之间的通信方式。如果您想记录聊天记录,请进行所有写入异步调用。

关于c# - 长轮询停止其他请求 1 或 2 分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11791911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com