我在ASP.NET Web应用程序中实现了一个基于Web的聊天平台,我使用类似于长轮询的技术.我的意思是我将来自客户端的每个Web请求保留特定时间段(超时)或直到新消息到达,然后将响应发送到客户端.
我将连接的客户端保留在内存中(字典对象),当有新消息发送到客户端时,我将此消息写入接收方客户端的消息数组中.客户端需要发送请求以获取自己的消息,并将此请求保存在内存中的数组中.
我正在使用异步http处理程序来监听客户端请求,我将Web请求保存在内存中的数组中.我使用线程从内存中连续检查新消息(在为每个客户端创建的字典中).
我不使用.net线程池线程来检查新消息或超时web请求.我创建这样的线程:
System.Threading.Thread t = new Thread(new ThreadStart(QueueCometWaitRequest_WaitCallback));
t.IsBackground = false;
t.Start();
Run Code Online (Sandbox Code Playgroud)
在每个线程的QueueCometWaitRequest_WaitCallback方法中,我处于无限循环中:
while (true)
{
...
Thread.Sleep(100);
}
Run Code Online (Sandbox Code Playgroud)
在这个方法中,我正在检查Web请求超时或每个Web请求的新消息,它也保存在内存中的数组中.
一切都很好,直到我注意到CPU使用率达到了100%的时间.(在第一个连接的客户端之后的几分钟内)在第一个请求开始时,一切似乎都正常,我的意思是在向客户端返回响应时CPU使用率不高于10%.但即使有2个客户端,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
}
}
} …Run Code Online (Sandbox Code Playgroud) 我正在考虑是否在我的ASP.NET Web应用程序中使用System.Threading.Timer或Thread.Sleep.我寻找他们的不同之处.期间或睡眠时间为100毫秒.AFAIK如果我使用Timer它不会阻止正在运行的线程,但Sleep将阻止正在运行的线程.
由于间隔非常小,选择Thread.Sleep(150)会更好吗?
编辑:我倾向于像非线程池线程上的计时器一样使用它.我知道Timers将在线程池上运行,但我不想为这样的操作保留线程池线程