2012-05-04 2 views
1

J'ai écrit mon code réseau pour mon application à l'aide de Sockets. J'ai testé la bibliothèque sur un PC Windows et c'est très rapide. Que ce soit de nombreux petits paquets (par paquets, je veux dire envoyer des opérations, j'utilise TCP qui est en streaming) de données dans un petit laps de temps, ou quelques grands, cela fonctionne parfaitement. J'ai déplacé le code dans une application de test pour l'iPhone. Ran le test, de nouvelles vitesses à nouveau. environ 5 Mo envoyés sur le wifi entre deux téléphones en environ 3 secondes. Im utilisant des opérations Socket.Send() synchrones dans un thread threadpool et en utilisant ReceiveAsync() pour la réception. (J'ai aussi essayé le style BeginReceive(), mais il se comporte de la même manièreAugmenter le nombre de threads ThreadPool dans Monotouch?

Cependant, une fois que je mets le code dans mon application, je commence à rencontrer des problèmes.Le problème général est que l'application de réception ne semble pas Je peux envoyer plusieurs "paquets" de données depuis le téléphone hôte, et cela peut être n'importe où, de quelques secondes à 10 minutes avant qu'elles n'apparaissent sur le récepteur. maintenant (soirs/week-ends) et j'ai passé des jours à le tester pour essayer de comprendre exactement ce que je peux faire pour le reproduire, mais ce n'est jamais le même deux fois

Actuellement, je le mets à l'épuisette J'ai utilisé

ThreadPool.SetMaxThreads() 

pour augmenter le nombre de threads de façon drastique, mais cela ne fait aucune différence. C'est comme si le rappel terminé dans SocketAsyncEventArgs ne pouvait pas faire fonctionner un thread, donc il se trouve juste là. J'ai parcouru mon code et refactorisé tout ce qui n'était pas nécessaire en utilisant des threads avec une boucle effectuant des tâches périodiques et les changeant en timers, mais le problème persiste.

Je n'ai littéralement aucune idée de l'endroit où tourner avec celui-ci. Je espère que c'est peut-être un bug dans Monotouch (pas que Im essayant de blâmer ces gars-là!). Je ne sais pas quel code publier, car le code réseau a été testé seul et fonctionne correctement. Je l'ai testé avec 1.000.000 envoyer/recevoir pour vérifier s'il y avait une sorte de fuite, mais n'a trouvé aucun problème.

Il semble que les données parviennent au destinataire, mais le rappel est en quelque sorte fortement retardé lors de l'appel, parfois de plusieurs minutes.

Quelqu'un peut-il me diriger dans une direction de pourquoi cela pourrait se produire?

Merci.

+1

L'augmentation du nombre de threads de pool n'est pas la bonne option; cela pourrait vraiment aggraver les choses, ou simplement tuer complètement votre système (trop de mémoire utilisée pour les piles). La première pensée qui se produit est: 'SendAsync'. La deuxième pensée qui se produit est d'avoir une file d'attente de messages sortants qui peuvent être desservis par un petit nombre de threads d'écriture, si nécessaire. Combien de clients soutenez-vous ici? (aussi, si c'est un bug, c'est un bug dans Mono, pas dans MonoTouch) –

+0

Oui, j'avais l'impression que l'augmentation des threads était une mauvaise idée. Je vais essayer d'utiliser SendAsync demain et voir si cela aide. Je pense que le problème se situe plutôt à l'extrémité réceptrice plutôt qu'à la fin de l'envoi. L'envoi se termine avec succès, mais la réception peut prendre quelques minutes (ou quelques secondes) pour le rappel. En ce qui concerne les clients, je vais probablement le limiter à 10 - 12 max clients – Dermot

+1

est activé (Socket.NoDelay')? essayez d'éteindre cela (bien sûr, vous devrez alors vous assurer de ne pas écrire trop petits paquets) –

Répondre

2

Mon problème avec ceci a été causé par l'initialisation d'une GKSession. J'espère que c'est un bug dans Monotouch/Mono qui peut être résolu, car j'ai besoin des deux fonctionnalités réseau activées. Dès que j'ai désactivé le GKSession, le code de la socket circule librement.

+0

Votre analyse a été prouvée suivre une très bonne approche. +1 –

+0

Avez-vous ouvert un bug sur bugzilla.xamarin.com? Si ce n'est pas le cas, faites-le s'il s'agit d'un bug, il peut être corrigé – dalexsoto

+0

Oui. Soumis avec un exemple d'application montrant un bug. – Dermot

Questions connexes