2012-12-12 5 views
7

저는 C#을 사용하여 트위터 스트림 API에서 데이터를 읽으려고했는데 때로는 API가 데이터를 반환하지 않고 거의 실시간 응답을 찾고 있기 때문에, 스트림이 다음 또는 이일 동안 더 이상의 데이터를 반환하지 않는 경우 판독기에서 1 바이트 이상의 버퍼 길이를 사용하는 것을 주저했습니다.한 번에 한 바이트 씩 읽지 않고 HTTP 스트림을 소비합니다.

내가 다음 줄을 사용하고 있습니다 : 지금은 응용 프로그램을 확장 할 계획이라고

input.BeginRead(buffer, 0, buffer.Length, InputReadComplete, null); 
//buffer = new byte[1] 

을, 나는 하나의 크기는 CPU 사용량이 많이 발생하고, 그 수를 증가 할 것이라고 생각 ,하지만 여전히 스트림이 막히는 것을 원치 않습니다. 다음 5 초 또는 그와 비슷한 것으로 바이트가 더 이상 읽히지 않으면 스트림을 반환 할 수 있습니까?

답변

4

비동기 더 바이트, 예를 들어 수신되지 않는 경우 작업을 완료하기 위해 비동기 콜백 메소드에 타이머를 사용할 수 있습니다

옵션 5 초. 바이트가 수신 될 때마다 타이머를 재설정하십시오. 시작하기 전에 시작하십시오.

또는

동기화 옵션, 당신은 읽기를 완료하기 전에 대기하는 최대 시간을 설정하는 기본 소켓의 ReceiveTimeout 속성을 사용할 수 있습니다. 더 큰 버퍼를 사용하고 제한 시간을 예 : 5 초.

이 속성은 MSDN documentation에서 동기 읽기에만 적용됩니다. 별도의 스레드에서 동기 읽기를 수행 할 수 있습니다.

UPDATE

여기에 비슷한 문제에서 함께 재현 거친, 검증되지 않은 코드입니다. 그것은 아마도 (버그가없는) 버그가없는 상태로 실행되지만, 당신에게 아이디어를 줄 것입니다 :

private EventWaitHandle asyncWait = new ManualResetEvent(false); 
private Timer abortTimer = null; 
private bool success = false; 

public void ReadFromTwitter() 
{ 
    abortTimer = new Timer(AbortTwitter, null, 50000, System.Threading.Timeout.Infinite); 

    asyncWait.Reset(); 
    input.BeginRead(buffer, 0, buffer.Length, InputReadComplete, null); 
    asyncWait.WaitOne();    
} 

void AbortTwitter(object state) 
{ 
    success = false; // Redundant but explicit for clarity 
    asyncWait.Set(); 
} 

void InputReadComplete() 
{ 
    // Disable the timer: 
    abortTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); 
    success = true; 
    asyncWait.Set(); 
} 
+0

트위터의 정책으로 인해 연결을 계속 열거 나 닫을 수 없습니다. 먼저 비동기 콜백 타이머를 사용하여 읽기를 일찍 끝낼 수있는 방법을 보여줄 수 있습니까? – HenryZhang

+0

@huadianz : 시작 지점을 알려주는 예제를 추가했습니다. –

+0

Read는 버퍼의 모든 데이터를 반환합니까, 아니면 데이터가 손실 되었습니까? – HenryZhang

관련 문제