我正在实现一个基于ASP.NET Web应用程序的网络聊天平台,并使用类似长轮询的技术。我的意思是,我保留客户端的每个Web请求一段特定的时间(超时)或直到有新消息到达,然后将响应发送给客户端。
我将连接的客户端保存在内存中(字典对象),每当向客户端发送新消息时,我将此消息写入接收方客户端的消息数组中。客户端需要发送请求以获取自己的消息,我将此请求保存在内存中的数组中。
我使用异步HTTP处理程序来监听客户端请求,将Web请求保存在内存中的数组中。我使用线程从内存中不断检查新消息(在为每个客户端创建的字典中)。
我不使用.NET线程池线程来检查新消息或超时的Web请求。我像这样创建线程:
在每个线程的QueueCometWaitRequest_WaitCallback方法中,我都会进入一个无限循环的while循环:
在这个方法中,我会检查每个Web请求的超时或新消息,这些请求也被保存在内存中的数组中。
一切都很顺利,直到我注意到CPU使用率在一段时间后达到了100%(即在第一个连接的客户端之后的几分钟)。 在第一个请求开始时,一切似乎都很正常,我的意思是在向客户端返回响应时,CPU使用率不会超过10%。但随着时间的推移,即使有两个客户端,CPU使用率也会增加到100%。似乎只有在为客户端请求编写响应时,CPU使用率才会达到100%。如果没有客户端剩余,则一切都会恢复正常(CPU使用率约为0%),直到客户端发出新的Web请求。
我不太了解线程,但我对我创建的并且无限工作的新线程持怀疑态度。就好像操作系统会在它们一直运行时为它们提供更多的CPU使用率和资源,而Thread.Sleep(100)却不起作用。
以下是QueueCometWaitRequest_WaitCallback()方法:
我将连接的客户端保存在内存中(字典对象),每当向客户端发送新消息时,我将此消息写入接收方客户端的消息数组中。客户端需要发送请求以获取自己的消息,我将此请求保存在内存中的数组中。
我使用异步HTTP处理程序来监听客户端请求,将Web请求保存在内存中的数组中。我使用线程从内存中不断检查新消息(在为每个客户端创建的字典中)。
我不使用.NET线程池线程来检查新消息或超时的Web请求。我像这样创建线程:
System.Threading.Thread t = new Thread(new ThreadStart(QueueCometWaitRequest_WaitCallback));
t.IsBackground = false;
t.Start();
在每个线程的QueueCometWaitRequest_WaitCallback方法中,我都会进入一个无限循环的while循环:
while (true)
{
...
Thread.Sleep(100);
}
在这个方法中,我会检查每个Web请求的超时或新消息,这些请求也被保存在内存中的数组中。
一切都很顺利,直到我注意到CPU使用率在一段时间后达到了100%(即在第一个连接的客户端之后的几分钟)。 在第一个请求开始时,一切似乎都很正常,我的意思是在向客户端返回响应时,CPU使用率不会超过10%。但随着时间的推移,即使有两个客户端,CPU使用率也会增加到100%。似乎只有在为客户端请求编写响应时,CPU使用率才会达到100%。如果没有客户端剩余,则一切都会恢复正常(CPU使用率约为0%),直到客户端发出新的Web请求。
我不太了解线程,但我对我创建的并且无限工作的新线程持怀疑态度。就好像操作系统会在它们一直运行时为它们提供更多的CPU使用率和资源,而Thread.Sleep(100)却不起作用。
以下是QueueCometWaitRequest_WaitCallback()方法:
void QueueCometWaitRequest_WaitCallback()
{
while (true)
{
if (processRequest.Length == 0)
{
Thread.Sleep(100);
}
else
{
for (int i = 0; i < processRequest.Length; i++)
{
Thread.Sleep(100);
// below I am checking for new message or request time out
.................
.................
// If new message or time out I write to response
}
}
}
}
我希望能够解释这种情况,并且也愿意接受任何建议(比如用不同的方式来实现)。
如果你能帮助我解决这个问题,我将非常感激,谢谢。
System.Threading.Timer
/System.Timers.Timer
,它会每隔N毫秒触发一次。 - sll