2010-08-23 4 views
3

비동기가 가능한 httpwebrequest와 관련된 많은 부분이 있습니다. 나는이 주제에 관해 여기서 질문을 읽은 것을 기억하지만 더 이상 찾을 수없는 것 같습니다. 그래서 다시 질문 할 것입니다. 다음 중 가장 많은 것을 얻은 다음 (말하자면).비동기 httpwebrequest의 부분

BeginGetRequestStream/EndGetRequestStream

그러면 BeginWrite/EndWrite

BeginGetResponse/EndGetResponse

그러면 BeginRead/EndRead

내가 BeginGetResponse가 BeginGetRequestStream와 결합되어야 함을 이해합니다. 그 사실을 다시 강조 할 필요가 없습니다.

내가 조사한 결과 BeginRead/EndRead가 가장 큰 잠재력을 갖고있는 것처럼 보입니다. 이것은 충격으로 조금왔다. 그것은 EndGetResponse가 상당히 빨리 돌아오고 "첫 접촉"과 실제 데이터가 읽히고 난 후 상당한 지연이있는 것 같습니다. 나는 몇 가지 헤더를 즉시 얻었고, 그 다음에는 긴 지연과 내가 원하는 데이터가 뒤따라 왔음을 확신한다.

내 진짜 질문은 다음과 같습니다. BeginGetResponse에 문제가 있습니까? 아니면 여기에 참된 가치있는 플레이어입니까? BeginRead?

항상 감사드립니다.

답변

2

EndGetResposnse (또는 실제로 동기 GetResponse)는 데이터 시작을 받으면 반환됩니다. 전체 응답 시간의 작은 부분이나 큰 부분 일 수 있습니다.

응답 시간이 길어서 가장 큰 부분은 이들 중 하나를 기다리지 않고 스트림 자체를 읽고 처리하는 데 소요됩니다. 특히 데이터 서버가 들어올 때 웹 서버가 청크 된 데이터를 전송하는 경우 특히 그렇습니다.

따라서 최대 성능 달성은 다음 단계로 효율적으로 전달할 수있는 방식으로 처리 할 수 ​​있습니다. 한 가지 방법은 httpwbrequest의 비동기 메서드를 사용하는 대신 전체 처리를 비동기로 만드는 것입니다.

기반의 ienumerable을 사용하여 응답으로 컬렉션 유형을 생성하는 경우 (지연된 실행 일종의 일괄 처리에서 매우 강력 함) 추가 yield 기반 처리 또는 LINQ 방식으로 전달). 이렇게하는 것의 이점은 asych 접근법을 취함으로써 얻을 수있는 이점보다 더 중요 할 수 있지만 결합 될 수도 있습니다.

+0

전체 httprequest (스트림 읽기 포함)를 다른 스레드 (위임을 통해 또는 다른 방법으로)로 이동하는 것을 말하고 있습니까? 나는 이러한 것들을 피하려고 노력하고 있습니다. 실제로 응답 시간을 얻는 것보다는 멀리있는 쓰레드를 재활용하고 싶습니다. – aepheus

+0

그건 내가 세 번째 단락의 두 번째 문장에서 언급 한 것입니다. 다음 아이디어는 스레딩에 전혀주의를 기울이지 않지만 응답 성은 다른 방식으로 얻습니다. 다른 방법으로 많은 이득이 있을지 확신하지 못합니다. 항상 처리 또는 차단중인 스레드가 있거나 스레드 한계를 때리는 문제입니까? –