/// <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();
}
}
1
A
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
- 1. Utilisation correcte de strncmp
- 2. E/S de socket asynchrones sur Android
- 3. Utilisation de l'annulation avec des tâches asynchrones
- 4. Utilisation correcte de la classe d'assistance Android Intent?
- 5. Monotouch - Utilisation de la classe Application comme stockage d'objets communs
- 6. Utilisation correcte de Doxygen
- 7. Utilisation correcte des propriétés de l'objet
- 8. Utilisation correcte des signaux PyQt
- 9. Utilisation correcte des propriétés lors de la gestion d'une collection
- 10. Utilisation correcte de DllImport
- 11. Utilisation correcte de ApplicationContext?
- 12. Utilisation correcte de la propriété de dépendance
- 13. Utilisation correcte de cette. dans un constructeur de classe
- 14. Utilisation correcte des threads dans Scheme (Bigloo)
- 15. Utilisation du spécificateur de classe de stockage "extern" dans C
- 16. utilisation correcte de GetClipRgn?
- 17. Utilisation correcte de CSS
- 18. MongoDB - Utilisation correcte des collections?
- 19. Est-ce une utilisation correcte de jQuery?
- 20. Utilisation de VPIM et stockage des contacts
- 21. Utilisation correcte de 'construct' lors de la conception de classes
- 22. Détacher un socket natif de la classe socket de Boost.ASIO
- 23. Utilisation correcte de la variable globale ruby $ *
- 24. Utilisation de MVP - Utilisation correcte des événements pour les tests
- 25. Utilisation correcte de MySQL LOAD_FILE()
- 26. Scatter/rassembler des E/S socket asynchrones dans .NET
- 27. utilisation correcte de destructuration-bind
- 28. System.Web.UI.WebControls.FontInfo utilisation correcte
- 29. Utilisation correcte des rappels Moq selon AAA
- 30. Utilisation correcte de l'application Déléguer pour envoyer des messages
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 ... –
Je m'en doutais autant. Je veux toujours le garder pendant un moment au cas où des âmes aimables seraient intéressées. – ChaosPandion
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. –