Какой .Net Timer () использовать - PullRequest
5 голосов
/ 10 октября 2008

У меня есть старое приложение WinForms Mdi в VB.Net 2.0, к которому я добавляю функциональность. Одним из дополнений является предупреждение, которое необходимо поднять, когда текущее время приближается к указанному значению (крайний срок). Мое намерение - проверять время один раз в час, пока не истечет менее часа до крайнего срока, а затем отображать предупреждения с заданными интервалами до истечения времени.

Пользователь должен иметь возможность продолжать использовать приложение до и даже после крайнего срока, но он должен периодически информироваться о приближении крайнего срока.

Приложение не использует System.Threading, и мои знания об этом в настоящее время ограничены. Я знаю, что есть 3 различных метода Timer ():

  • System.Threading.Timer (),
  • Windows.Forms.Timer () и
  • System.Timers.Timer ()

Мой вопрос: какой лучший способ пойти с этим? Я попытался использовать многопоточный таймер, но поскольку WinForms не являются поточно-ориентированными, я получил ошибку времени выполнения, пытаясь получить доступ к другому классу. Стоит ли делать поток класса / формы безопасным? Я совершенно не в курсе?

Спасибо.

Ответы [ 5 ]

11 голосов
/ 10 октября 2008

Эта статья объясняет довольно хорошо:

Сравнение классов таймеров в библиотеке классов .NET Framework

Звучит так, будто System.Windows.Forms.Timer - это то, что вам нужно.

Мое руководство: если вы хотите, чтобы таймер работал в вашем основном потоке графического интерфейса, придерживайтесь Windows.Forms.Timer. Если ваш таймер будет вызываться асинхронно в потоке пула потоков, или если вы не хотите испытывать небольшие задержки, от которых страдает System.Windows.Forms.Timer, используйте System.Timers.Timer. System.Threading.Timer имеет интерфейс, отличный от двух других, и не является поточно-ориентированным; лично я не фанат.

6 голосов
/ 10 октября 2008

Я бы просто использовал таймер форм. Я думаю, что прочитал, что это не так точно, но звучит так, будто вам это не нужно.

2 голосов
/ 12 октября 2008

Я согласен, что Windows.Forms.Timer () лучше всего подходит для этого случая, поскольку он решает проблемы перекрестной сортировки потоков.

Некоторые полезные ссылки:

0 голосов
/ 10 октября 2008

System.Forms.Timer фактически работает в основном потоке, используя очередь сообщений Windows. Это делает его несколько неточным, но поскольку вам не нужна точность мс, этого достаточно. Вы можете использовать один из других таймеров, которые работают в отдельном потоке, но поскольку вам нужно активировать компонент winforms, работающий в основном, вам нужно использовать Form.Invoke или какой-то другой способ передать событие в основной поток что также приведет к некоторой задержке. В заключение используйте System.Forms.Timer, когда вам нужно активировать компонент на основе winforms.

0 голосов
/ 10 октября 2008

Хорошо, обо всем по порядку ...

Если вы хотите показать пользователю форму и сделать что-то в фоновом режиме, я бы использовал класс BackgroundWorker , он работал у меня раньше. Кроме того, вам нужно вызывать методы, как упоминалось ранее, и, как сказал Крис, это звучит сложнее, чем на самом деле.

Вот ссылка, которая, я думаю, поможет вам.
http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx

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