Я пишу приложение на c #, которое использует класс SerialPort
для связи с несколькими устройствами.Теперь большая проблема, с которой я сталкиваюсь все время, заключается в том, как правильно освободить ресурсы там, поскольку вы сразу получаете исключение при попытке использовать последовательный порт, который уже используется.
Так как обычно GCЯ должен позаботиться о большей части работы. Я вроде как из идей, что еще попробовать ...
В основном я пробовал 2 вещи, которые (по моей логике) должны делать эту работу.Я использую сеанс связи, поэтому я вызываю методы OpenPort
и ClosePort
до и после каждого сеанса связи, поэтому порт должен быть закрыт.Также я попытался установить для моего объекта, содержащего порт, значение null впоследствии - но все равно я получаю UnauthorizedAccessExceptions
все время - хотя я на 100 процентов уверен, что был вызван метод SerialPort.Close()
.
Делаете ли выребята, есть ли какие-нибудь лучшие способы освободить порты, чтобы я перестал получать это исключение?
РЕДАКТИРОВАТЬ: Спасибо за ответы, но материал Dispose () не работает - я пробовал это раньше - может быть, яделаю что-то не так, но вот пример того, как выглядит мой код:
На самом деле это очень похоже на то, что предложил Ойвинд, хотя я только добавил IDisposable
- но тоже не работает:
это будет мой класс-обёртка:
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();
}
}
Теперь, когда мне нужно общение по rs232, я вызываю новый экземпляр, подобный этому:
clsRS232 test = new clsRS232;
test.openport();
test.sendfunc("test");
test.Dispose();
Но это ничего не меняет - я всё равно получаюмножество UnauthorizedAccessExceptions - и если другой парень был прав (этот Dispose () класса SerialPort содержит только SerialPort.Close ()) - тогда я думаю, что я ничего не изменил по сравнению с моимпредыдущий подход, где у меня был вызов функции close ();
спасибо за ваши ответы - все еще надеюсь найти решение:)