2009-12-02 2 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

La possibilité de publier du code pour examen a été discutée dans http://stackoverflow.com/questions/405009/so-community-code-reviews. En voyant cela se produire pour de vrai, je dois dire que je doute que vous obtiendrez beaucoup de réponses. Au moins vos collègues seraient payés pour revoir le code. L'idée avec le format Q/A est que plusieurs personnes auront la même question et bénéficieront de réponses bien conçues. Avec des critiques, pas tellement ... –

+0

Je m'en doutais autant. Je veux toujours le garder pendant un moment au cas où des âmes aimables seraient intéressées. – ChaosPandion

+1

Vous devez identifier les problèmes qui vous semblent préoccupants et formuler une question générique, afin que nous puissions y répondre de manière plus générique et que la réponse puisse être utilisée à plusieurs reprises avec ceux qui rencontrent un problème similaire. –

Répondre

2

Il y a des problèmes. "fini" doit être volatile mais ne peut pas l'être, utilisez MRE. Votre code de délai d'attente peut se bloquer sur une exception OverflowException. Vous traduisez des exceptions.

Mais l'approche n'a pas de sens, il n'y a pas de point dans l'attente d'une opération asynchrone pour terminer. Utilisez Socket.ReceiveTimeout pour obtenir l'exception de délai d'expiration.

+0

Je ne pense pas que le fini doit être volatile dans ce cas. http://stackoverflow.com/questions/59422/is-a-bool-read-write-atomic-in-c – ChaosPandion

Questions connexes