2009-04-19 7 views
0

J'ai un très gros problème avec la classe SerialPort et j'ai besoin d'aide pour résoudre ce problème.fuite de mémoire SerialPort dans .NET 2.0/3.5

Nous utilisons plusieurs port série dans une liste générique car nous devons nous connecter à plusieurs périphériques.

Voici ce que notre code de base ressemble ...

List<SerialPort> ports = new List<SerialPort>(); 
private void button1_Click(object sender, EventArgs e) 
{ 
    ports.Add(new SerialPort("COM6")); 
    ports.Add(new SerialPort("COM7")); 
    ports.Add(new SerialPort("COM8")); 
    foreach (SerialPort port in ports) 
    { 
     port.Open(); 
    } 
} 

Maintenant, après clique sur le bouton, si l'un des appareils (téléphone mobile dans notre cas) est mis hors tension ou si le câble est déconnecté du port USB, il y a une fuite massive de mémoire immédiate.

S'il vous plaît aidez-nous avec une solution.

J'ai remarqué un thread similaire here et quelques rapports de bogues dans Microsoft Connect. Mais maintenant j'ai besoin d'une solution IMMÉDIATE URGENTE ... J'apprécierais vraiment si quelqu'un m'aide. Merci beaucoup.

+0

btw, ce lien va à experts-échange (pas Microsoft Connect) et ne semble pas fonctionner. Comme un drôle de côté, s'il n'y avait pas de tiret entre les mots, il pourrait se lire comme «changement de sexe expert» qui est très différent de «l'échange d'experts», mais toujours un site entièrement valide. Trop drôle. –

+0

Si vous avez besoin d'une solution immédiate et urgente, alors, tout comme StackOverflow, vous devez appeler Microsoft Support et ouvrir un ticket. –

Répondre

2

Etes-vous sûr que le problème est avec SerialPort et non le pilote du périphérique USB-Serial? Je voudrais essayer un autre test pour valider la question:

  1. Démarrage hyperterm
  2. Connectez-vous à votre appareil de problème
  3. Vérifier l'utilisation de la mémoire
  4. Disconnect de la même façon qui cause problème en C#
  5. vérification de la mémoire utiliser et comparer

Si cela n'arrive pas, alors il y a un bug en particulier à SerialPort . Si cela se reproduit, vous savez au moins que cela n'a rien à voir avec l'implémentation de SerialPort. Le problème peut être dans le code du port COM de Windows ou dans le pilote que vous utilisez. Personnellement, je trouve plus probable que le problème soit dans le pilote, mais j'aimerais savoir s'il y a un problème inconnu avec les ports série de Windows.

J'ai déjà utilisé SerialPort avant de connecter/déconnecter des ports sans problème.

Une autre chose que vous pouvez essayer est de déboguer dans le code du CLR. Il y a beaucoup d'autres questions SO sur ce topic, donc il devrait être facile de trouver la méthode pour le faire. Cela devrait vous permettre de déboguer un peu plus loin et voir exactement à quel point dans Open() la fuite de mémoire se produit. Attention cependant, puisqu'il s'agit d'un wrapper "simple" sur le port série du système, vous pourriez rapidement le voir passer au monde P/Invoke et ne verra probablement pas grand chose.

+0

Oh, et pour commenter sur le design, votre on_click ne devrait pas faire le code, il devrait appeler une méthode qui fait l'ouverture (factoriser cette fonctionnalité afin qu'elle n'appartienne pas au code de l'interface utilisateur). –

1

Vous n'êtes pas sûr que le problème soit aussi simple, mais disposez-vous correctement de vos objets SerialPort? Vous devez appeler la méthode Dispose sur chaque instance dès que vous avez terminé avec eux.

+0

'Dispose()' est uniquement là pour permettre la libération * explicite immédiate * d'une ressource. Chaque classe qui utilise des ressources non managées implémente également un finaliseur, dans le cas où l'objet est hors de portée sans avoir été éliminé explicitement. Un filet de sécurité si vous voulez. –

+0

Oui, le GC va bien sûr avoir à se débarrasser des ressources non managées utilisées par la classe, mais cela peut ne pas arriver pendant un certain temps, surtout si les objets sont dans la portée globale. Cela pourrait facilement conduire à une fuite de mémoire. – Noldorin