ASP.NET 웹 응용 프로그램에서 웹 기반 채팅 플랫폼을 구현하고 있으며 긴 폴링과 유사한 기술을 사용합니다. 내 말은 클라이언트의 각 웹 요청을 특정 시간 (시간 초과) 동안 또는 새 메시지가 도착할 때까지 유지 한 다음 클라이언트에 응답을 보내는 것을 의미합니다.스레드의 무한 루프에서 CPU 사용이 최대 100 %까지 증가합니다.
나는 연결된 클라이언트를 메모리에두고 (사전 객체) 새로운 메시지가 클라이언트로 전송 될 때이 메시지를 수신자 클라이언트의 메시지 배열에 씁니다. 클라이언트가 자신의 메시지를 가져 오기 위해 요청을 보내야하며이 요청을 메모리의 배열에 보관합니다.
청취 클라이언트 요청을 위해 비동기 http 처리기를 사용하고 있습니다. 웹 요청을 메모리에 보관하고 있습니다. 스레드를 사용하여 새 메시지를 메모리에서 계속 확인합니다 (각 클라이언트에 대해 생성 된 사전에 있음).
나는 새로운 메시지를 확인하는 .NET 스레드 풀 스레드를 사용하지 않거나 웹 requests.I는 다음과 같이 스레드를 만들 시간 초과 :
System.Threading.Thread t = new Thread(new ThreadStart(QueueCometWaitRequest_WaitCallback));
t.IsBackground = false;
t.Start();
각 스레드의 QueueCometWaitRequest_WaitCallback 방법에서 나는 무한의 루프 동안입니다 :
이 방법에서는 웹 요청 시간 초과 또는 메모리의 배열에 보관 된 각 웹 요청에 대한 새 메시지를 확인합니다.
CPU 사용량이 최대 100 %에 도달 할 때까지 모든 것이 잘 작동하고있었습니다. (처음 연결된 클라이언트가 연결된 후 몇 분 안에) 첫 번째 요청이 시작될 때 모든 것이 정상적인 것처럼 보입니다. 클라이언트에 대한 응답을 반환하는 동안 CPU 사용량이 10 %를 넘지는 않습니다. 하지만 시간이 지남에 따라 2 개의 클라이언트에서도 CPU 사용량이 최대 100 %까지 증가합니다. 그것은 클라이언트 요청에 대한 응답에 쓰는 경우에만 CPU 사용량이 100 % 인 것 같습니다. 클라이언트가 없으면 클라이언트가 새 웹 요청을 완료 할 때까지 모든 것이 정상 (CPU 사용률은 약 0 %)으로 돌아갑니다.
스레드를 자세히 알지는 못하지만, 내가 만든 새 스레드에 대해서는 의심 스럽습니다. 운영 체제가 항상 작동하기 때문에 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
}
}
}
}
, 나는
(다른 방법으로 구현 등)뿐만 아니라 어떤 제안에 열려입니다 당신이 만약 이 문제를 도와 드리겠습니다. 감사합니다. 감사합니다.
기본적으로 N 밀리 초마다 새 메시지를 확인해야합니까? 그것은 전부 또는 다른 것이 비동기로 수행되어야합니까? 그렇다면 비동기'System.Threading.Timer' /'System.Timers.Timer'를 사용하십시오. 각 N-milliseconds를 트리거합니다. – sll
대략 달성하고자하는 목표입니까? while (true) {Thread.Sleep (100); –
@sll : 클라이언트 (새 메시지)에 응답을 반환해야합니다.
이것은 채팅이기 때문에 (예 : processRequest에서 var req) {performProcessRequest (req) 응용 프로그램, 검사 기간이 너무 길어서는 안됩니다, 나는 타이머를 사용하는 경우 1 초보다 작을 필요가 있다고 생각합니까? – Mehmet