Использование-Pattern в цикле while - PullRequest
1 голос
/ 07 декабря 2010

Я немного застрял с небольшой проблемой: Я использую последовательный порт связи - все мои функции для комм. завернуты в мой собственный класс serialport. Экземпляры этого класса должны использоваться только в

 using(Serport port = new Serport(...)){}

, чтобы убедиться, что Dispose () вызывается после операции.

Теперь это не проблема с одноразовыми вызовами, но я не могу придумать, как это сделать: У меня есть функция, которая должна вызываться через цикл while для постоянного обновления через comport до тех пор, пока пользователь не прервет (функция предназначена для сброса самого таймера каждый раз, когда он вызывается, и времени ожидания, когда он больше не вызывается). Теперь эта операция довольно критична по времени и не может открывать и закрывать последовательный порт при каждом вызове. Таким образом, использование шаблона использования изнутри этой функции не сработает (или так?) Единственный способ реализовать это, о котором я могу подумать, - это поместить using () {} в цикл while - я бы хотел этого избежать, хотя, поскольку он перепутал бы мой код, который явно построен каким-то образом, это компортирует доступ обрабатывается на низком уровне, а для реального приложения доступны только простые функции, которые выполняют всю работу ...

Ребята, вы видите какую-нибудь альтернативу? Есть ли способ прекратить использование шаблона вручную? Простой вызов Dispose () вручную в моем тайм-ауте не сработает, так как он не будет вызван, если я получу исключение - и я должен быть уверен, что Dispose () вызывается, поэтому последовательный порт остается управляемым ...

Спасибо за вашу помощь !!

Ответы [ 2 ]

1 голос
/ 07 декабря 2010

Вам не нужно использовать оператор using для IDisposable:

От MSDN :

Использование оператора гарантирует, что Dispose являетсявызывается, даже если возникает исключение, когда вы вызываете методы объекта.Вы можете достичь того же результата, поместив объект в блок try, а затем вызвав Dispose в блоке finally;на самом деле, именно так оператор using переводится компилятором.Ранее приведенный пример кода расширяется до следующего кода во время компиляции (обратите внимание на дополнительные фигурные скобки, чтобы создать ограниченную область видимости для объекта):

{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}

Вы можете убедиться, что ваша обработка исключений вызывает вызов Dispose, или вы можете, например, заставить некоторый внешний родительский класс наследовать от IDisposable:

void Parent.Dispose()
{
  if (port != null)
  {
    port.Dispose();
  }
}

и обернуть создание родительского объекта в оператор using, и пусть it беспокоиться о вызове Dispose на Serport.

0 голосов
/ 07 декабря 2010

Вы захотите, чтобы ваш последовательный порт был открыт в течение всей продолжительности сеанса, потому что, если вы постоянно открываете / закрываете его, вы наверняка потеряете данные и сломаете любой протокол, который хотите, над ним.хочу поделиться своим серийным комм-сообщением с несколькими другими объектами, это совсем другая история.

Итак, попробуйте открыть его один раз, закрыть и утилизировать, когда он действительно больше не понадобится.Вывод: использование «использования» не очень практично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...