2009-12-02 5 views
1
/// <summary></summary> 
private Byte[] _ReceiveBytes(Int32 size) 
{ 
    MemoryStream memory = null; 
    SocketAsyncEventArgs args = null; 
    EventHandler<SocketAsyncEventArgs> completed = null; 
    Exception exception = null; 
    Int32 last_update = Environment.TickCount; 
    Boolean finished = false; 
    Int32 count = 0; 
    Int32 received = 0; 

    completed = new EventHandler<SocketAsyncEventArgs>((s, e) => 
    { 
     try 
     { 
      count = e.BytesTransferred; 
      last_update = (count > 0 ? Environment.TickCount : last_update); 
      memory.Write(e.Buffer, 0, count); 
      received += count; 
      finished = (received == size); 
      if (!finished) 
      { 
       count = Math.Min(_ChunkSize, size - received); 
       args.SetBuffer(new Byte[count], 0, count); 
       if (!_Socket.ReceiveAsync(e)) 
       { 
        completed(s, e); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      exception = ex; 
     } 
    }); 

    using (memory = new MemoryStream()) 
    using (args = new SocketAsyncEventArgs()) 
    { 
     count = Math.Min(_ChunkSize, size - received); 
     args.SetBuffer(new Byte[count], 0, count); 
     args.Completed += completed; 

     if (!_Socket.ReceiveAsync(args)) 
     { 
      completed(_Socket, args); 
     } 

     while (!finished) 
     { 
      Thread.Sleep(_SleepTimeSpan); 
      if (exception != null) 
      { 
       throw new Exception(_ReceiveExceptionMessage, exception); 
      } 
      else if (!finished && Environment.TickCount - last_update > _ReceiveTimeout) 
      { 
       throw new TimeoutException(_TimeoutExceptionMessage); 
      } 
     } 

     return memory.ToArray(); 
    } 
} 
+2

검토 용 코드 게시 가능성은 http://stackoverflow.com/questions/405009/so-community-code-reviews에서 논의되었습니다. 그것이 실제로 일어나는 것을 보면서, 나는 당신이 많은 해답을 얻는 지 의심 스럽다. 적어도 동료는 코드를 검토하기 위해 돈을 지불해야합니다. Q/A 형식의 아이디어는 여러 사람이 똑같은 질문을하고 잘 만들어진 답변을 얻을 수 있다는 것입니다. 리뷰와 함께, 그렇게 많이 ... –

+0

나는 많이 의심합니다. 어떤 종류의 영혼이 관심이있는 경우를 대비하여 나는 아직도 그것을 유지하고 싶습니다. – ChaosPandion

+1

당신은 관심사이고 일반적인 질문을 공식화하는 문제를 골라 내야합니다. 우리는 더 일반적으로 대답 할 수 있고, 비슷한 문제에 직면하는 사람은 계속해서 대답을 반복해서 사용할 수 있습니다. –

답변

2

문제가 있습니다. "finished"는 휘발성 일 필요가 있지만 반드시 사용할 수는 없습니다. MRE를 사용하십시오. OverflowException에서 시간 초과 코드가 충돌 할 수 있습니다. 예외를 번역하고 있습니다.

그러나이 방법은 의미가 없으므로 비동기 작업이 완료 될 때까지 기다리지 않아도됩니다. 타임 아웃 예외를 얻으려면 Socket.ReceiveTimeout을 사용하십시오.

+0

나는이 경우 완결해야한다고 생각하지 않는다. http://stackoverflow.com/questions/59422/is-a-bool-read-write-atomic-in-c – ChaosPandion

관련 문제