Как избавиться от Forms.Timer на Compact Framework - PullRequest
2 голосов
/ 22 февраля 2011

В Compact Framework класс System.Windows.Forms.Timer не поддерживает конструктор system.componentmodel:

поддерживается новый таймер (): http://msdn.microsoft.com/en-us/library/aa335543(v=vs.71).aspx

новыйТаймер (контейнер IContainer) не поддерживается: http://msdn.microsoft.com/en-us/library/aa335544(v=vs.71).aspx

Это означает, что когда я добавляю Таймер в форму в приложении CF, он не добавляется в поле компонентов IContainer формы, поэтомуне получают auto-dispose () d, когда форма dispose () d.

Почему это не поддерживается?

Как лучше всего использовать Timers, когда моя форма удаляется?Похоже, у меня есть два основных варианта:

  • переместить метод dispose () формы из .designer.cs в мой основной файл .cs и добавить ручной вызов _timer.dispose () втам
  • или вручную добавить объект Timer в коллекцию компонентов при создании формы после того, как InitializeComponent () был вызван

Что мне лучше выбрать?Если я забуду сделать одно из этих двух действий, Timer будет жить вечно, сохраняя мою форму живой (потому что Timer не может быть GCed, и он содержит ссылку на метод Timer_Tick () моей формы, поэтому форма никогда не может быть GCed).

Отражает ли это решение по реализации некоторую странность в отношении таймеров и утилизации на машинах CF, о которой мне нужно знать?

1 Ответ

3 голосов
/ 22 февраля 2011

Я бы проголосовал за вариант 3: не добавляйте таймер через конструктор форм; вместо этого добавьте его вручную в код и вручную добавьте его в коллекцию компонентов.

Мое рассуждение об этом выглядит следующим образом:

  • Вред с кодом дизайнера - это вообще плохая идея, поэтому ваш первый вариант имеет запах кода
  • Добавление его в коллекцию компонентов вручную очень предрасположено к будущим разработчикам (даже к себе через несколько месяцев), не понимающим, почему это происходит, и получающим поддержку.
  • Мне вообще не нравится "смешивать" инициализацию объекта. Если дизайнер выполняет инициализацию объекта, он должен сделать все этого или ни одного этого, а не просто часть. Выполнение некоторой частичной работы смертельно опасно, если код поддерживается или во время повторного использования, когда кто-то выполняет копирование и вставку в другой класс.
...