J'écris une application en C# qui utilise la classe SerialPort
pour communiquer avec quelques périphériques. Maintenant, le gros problème que j'ai rencontré tout le temps est de savoir comment libérer correctement des ressources là-bas, puisque vous obtenez immédiatement une exception en essayant d'utiliser un port série qui est déjà utilisé.Libérer le port série correctement
Depuis normalement le GC doit prendre soin de la plupart du travail que je suis un peu d'idées que d'autre pour essayer ...
Principalement j'ai essayé 2 choses (dans ma logique) devrait faire le travail. J'utilise une communication basée sur une session, donc j'appelle une méthode OpenPort
et une méthode ClosePort
avant et après chaque communication - donc le port doit être fermé. J'ai également essayé de définir mon objet contenant le port à null par la suite - mais je reçois toujours UnauthorizedAccessExceptions
tout le temps - même si je suis sûr à 100% que la méthode SerialPort.Close()
a été appelée. Connaissez-vous de meilleurs moyens de libérer les ports afin que j'arrête d'obtenir cette exception?
EDIT: Merci pour les réponses, mais la méthode Dispose() des choses ne fonctionne pas - j'avais essayé avant - peut-être que je fais quelque chose de mal mais est un exemple alors voici ce que mon code ressemble à:
il est en fait tout à fait comme Øyvind suggéré, bien que je viens d'ajouter le IDisposable
- mais ne fonctionne pas non plus:
ce serait donc ma classe d'emballage:
class clsRS232 : IDisposable
{
public void clsRS232()
{
Serialport port = new Serialport("COM1",9600,Parity.none,8,Stopbits.one);
}
public void openPort()
{
port.Open();
}
public void sendfunc(string str)
{
port.Write(str);
}
public string readfunc()
{
port.ReadTo("\n");
}
public void Dispose()
{
port.Dispose();
}
}
maintenant, chaque fois que je besoin de communication rs232 gique la nouvelle instance comme ceci:
clsRS232 test = new clsRS232;
test.openport();
test.sendfunc("test");
test.Dispose();
Mais cela ne change rien - je reçois encore beaucoup de UnauthorizedAccessExceptions - et si l'autre gars avait raison (Cédant() de SerialPort classe contient uniquement des SerialPort.Close ()) - eh bien je suppose que je n'ai pas vraiment changé quelque chose par rapport à ma précédente approche, où j'avais une fonction call close();
merci pour vos réponses - toujours dans l'espoir de trouver la solution :)
Merci pour la réponse rapide, mais je ne peux pas vraiment le faire de cette façon, car je ont enveloppé beaucoup de méthodes propres dans une classe propre, que j'utilise pour la communication série - ils utilisent tous le même port, qui est initialisé quand la classe est appelée pour la première fois - donc si je voulais le faire de cette façon, je finirais par écrire un bloc comme ça dans chaque méthode qui utilise le port non? – Lorenz
Voulez-vous conserver le port ouvert à partir du moment où vous créez la classe et fermez-le lorsque toutes les opérations sont terminées ou souhaitez-vous ouvrir et fermer la connexion au port avant et après chaque opération? –
le premier - ma classe wrapper démarre une instance de SerialPort via son constructeur - cela peut alors être utilisé via plusieurs méthodes pour envoyer/recevoir, etc mais une fois que j'appelle ma propre fonction close() (qui contient pour le moment SerialPort.Fermer()) Je veux que le Serialport soit complètement libre pour être à nouveau instancié. Ouvrir et fermer ebefore et après chaque opération ne fonctionnerait pas puisque par exemple j'aurais alors fermé le port après avoir écrit quelque chose et l'avoir ouvert à nouveau pour recevoir quelque chose -> le tampon aurait disparu ... – Lorenz