2011-10-15 2 views
-1

이 나쁜 프로그래밍입니까?나쁜 프로그래밍인가요?

DateTime dtExpire = DateTime.Now.AddSeconds(90); 
while (client.Connected && DateTime.Now < dtExpire) 
{ 
    if (client.Available == 0) continue; 
    //or can also use: if (!networkStream.DataAvailable) continue; 

    dtExpire = DateTime.Now.AddSeconds(30); 

    //now do stuff with client via stream 
} 

클라이언트도 서버가 수신 메시지를 pocess을 기다릴 것보다 MOR 시간을 갖지 않음을 보장 할 것을 목표입니다. 물론이 코드는 Try/Catch 블록과 Using Stream 블록 내부에 있으므로 서버는 끊어진 연결이나 다른 소켓 예외를 정상적으로 처리합니다.

기본적으로 나는 이것을 처리하는 더 좋은 방법이 있는지 알고 싶습니다. 감사.

+3

실제 질문과 관련이없는 막연한 네트워크 작업을 제외하면 TCP와는 아무런 관련이 없습니다. 여기서 사용하는 언어부터 시작하여 (C#?) –

+0

당신은 무엇을하려하고 있습니까? – Ekk

+3

코드 검토에 적합 할 수도 있습니다. – TMB

답변

4

들어오는 메시지를 기다리는 시간을 지정하려면 ReceiveTimeout 속성을 사용하십시오. Receive 메서드 (또는 메서드 모음)를 사용하고 시간 초과가 발생하면 SocketException이 발생합니다.

client.ReceiveTimeout = 90; 

비동기 적으로 수행해야하는 코드는 더 복잡하지만 사용자에게는 보이지 않습니다. Receive 자체가 현재 스레드에서 차단 될 때 작업을 수행해야합니다.

+0

고마워, 그게 내가 찾고 있었던거야; ReceiveTimeout을 추가했습니다. –

1

busy waiting이라고합니다.

"실제"수행 할 작업이없는 경우 (즉, client.Available이 0이 아닌 다른 상태가되기를 기다리는 경우)에는 CPU가 막히게됩니다. 다행히도, 당신의 바쁜 대기는 적어도 CPU를 영원히 막히지는 않을 것이다.

더 효율적으로 할 수 있는지 여부는 client이 무엇인지에 따라 달라지며보다 효율적인 대기 전략을 구현하는지 여부에 달려 있습니다.

그것은 당신이 바쁜 대기의 형태로 붙어있을거야 없지만, 모두가 손실되지 않으면 - 당신이 다음 client.Available의 변화를 감지하기에 약간의 지연을 허용 할 수 있다면 ...

if (client.Available == 0) { 
    Thread.Sleep(max_delay_you_can_tolerate); 
    continue; 
} 

... CPU에서 압박감을 느껴야합니다.

--- 편집 ---

client 만약 사실 Socket에, BlockingReceiveTimeout 특성을 살펴입니다.