2009-12-11 6 views
1

내가 비동기 읽기 콜백 함수를 쓰고 있어요 나는 순간의 C#을 배우고로 다음과 같은 재귀 경우 부탁드립니다 (그것은 내 아니지만 광산과 유사합니다 구성입니다) :비동기 I/O 콜백 함수가 재귀 적입니까?

protected void ReadCompleted(IAsyncResult iResult) 
    { 
     byte[] byIn = (byte[])iResult.AsyncState; 
     try 
     { 
      File.EndRead(iResult); 
      try 
      { 
       HandleDataReceived(byIn); 
      } 
      finally 
      { 
       BeginAsyncRead(); //recursion?? 
      } 
     } 
     catch (IOException ioexc) 
     { 
      // Device has been removed! 
     } 
    } 

지금은 특히 재귀에 대한 것이 아니지만 엄청난 메모리를 소비 할 가능성이있는 무언가를 작성할 때 피하고 싶습니다. 이 전체 함수 자체는 BeginAsync() 내에서 호출됩니다.

답변

1

예, 가능합니다. 비동기 작업이 동 기적으로 완료 될 수 있으므로 IAsyncResult 인터페이스에 CompletedSynchronously 속성이 있습니다. 그게 당신의 프로그램에 문제를 일으킬 수 있는지를 짐작하기는 어렵습니다. 스 니펫에 컨텍스트가 충분하지 않습니다.

메모리에 대해 걱정할 필요가없는 한 가지, 완전히 동 기적으로 더 이상 소모하지 않습니다. 스택 공간이 충분하면 걱정할 것입니다. BeginAsyncRead() 메서드가 실행되는 동안 ReadCompleted 콜백이 다시 호출됩니다. 내가 말할 수있는 것은 극단적으로입니다. StackOverflowException이 발생하지 않을 것 같습니다. 나는이 문제로 고통받는 사람은 들어 본 적이 없다.

스택 공간이 부족하기 전에 읽는 모든 장치가 버퍼에서 데이터를 모두 소비합니다. 우선이 작업을 수행 할 수있는 장치가 거의 없으며 소켓 만 알고 있습니다. 어쩌면 파일 시스템 일 수도 있지만, 비동기 I/O는 거의 사용하지 않을 것입니다.

0

아니요. 재귀 함수는 자체를 호출합니다. File.EndRead 또는 HandleDataReceived 또는 BeginAsyncRead가이 함수 또는 호출 순서의 다른 함수를 호출하지 않으면이 함수는 재귀가 아닙니다.

+0

이 함수는 BeginAsyncRead 내에서 호출되고 다른 호출은 BeginAsyncRead에 배치되었으므로 여기에 나타났습니다. BeginAsyncRead 함수의 또 다른 인스턴스를 만들 수 있다고 생각했습니다. –

+0

그럴 경우 그렇습니다. 그러나 f1 -> f2 -> f3 -> f4 -> f1과 같은 재귀 호출은 이해하기 어렵고 디버깅하기가 어렵습니다. – Michael