Member 8474866 Ответов: 3

Как я могу "приостановить" систему.Таймер в VB.NET?


голосование вниз
любимый


Я использую system. timer в службе Windows для запуска процесса, который обычно превышает интервал таймера. Я пытаюсь удержать таймер от запуска одного и того же кода более одного раза, известная проблема с system.timers.

Что я хочу: таймер запускает мой код, но таймер "делает паузу", чтобы дождаться завершения кода, прежде чем возобновить тики.

У меня две проблемы:

1. способ работы system. timers заключается в том, что таймер создаст для вас состояние гонки, запустив новые избыточные потоки того же кода и накапливая их на вас, если они не завершатся к тому времени, когда истечет интервал таймера.

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

Как же вы удерживаете system. timer от запуска новых избыточных потоков того же кода, если процесс не завершен к тому времени, когда интервал таймера истек? Очевидно, что запуск/остановка (включение / выключение) таймера не является решением, так как он не работает.

Помогите!

Sergey Alexandrovich Kryukov

Я не знаю такой классовой системы.Таймер? Какой таймер вы действительно используете? Зачем вообще использовать таймер?
—СА

PIEBALDconsult

Вы можете отключить его в начале метода и снова включить в конце.

3 Ответов

Рейтинг:
1

Neil Tsakatsa

Вы можете попробовать использовать систему.Класс нарезания резьбы.

Код будет выглядеть примерно так :


Sub Test()
     Dim myThread As System.Threading.Thread = Nothing
     Dim myWebBrowser As WebBrowser = Nothing
     myThread.Start(myWebBrowser)

     ' Suspends the current thread for a specified time
     Threading.Thread.Sleep(10000)
 End Sub


Graeme_Grant

это просто неправильно!

Neil Tsakatsa

Этот парень говорил о приостановке таймера. Управление таймером не может быть приостановлено, и, кстати, таймер действует как некоторая форма цикла, поэтому вместо использования таймера вы можете поместить код в поток, который можно приостановить/остановить, а затем снова запустить ! Это правильно, если вы хотите, чтобы ваш код имел некоторые перерывы/провалы.

Graeme_Grant

Вы не применяете исправление клуджа к неправильному способу ведения дел.

Вы также упустили мою точку зрения, совершенно не похожую на Ральфа. Зачем отвечать на 2-летний надгробный вопрос??

Neil Tsakatsa

Есть много способов убить кошку ! Если я думаю, что мне есть чем поделиться, я должен поделиться этим независимо от того, является ли это вопрос 2-летней или 10-летней давности. У кого-то может быть такая же проблема прямо сейчас, этот парень не первый, у кого есть эта проблема, и, вероятно, не последний. Этот ответ, вероятно, поможет кому-то, может быть, через 5 лет ! Вот для чего существует сообщество с открытым исходным кодом. Если вы не являетесь поклонником open source, вам, вероятно, стоит попробовать Apple !

Graeme_Grant

Возможно, вы захотите ознакомиться с публикацией сайта T&Cs...

Тогда я с нетерпением жду ваших статей в сообществе Open Souce.

Neil Tsakatsa

Спасибо. В среде с открытым исходным кодом любой желающий может поделиться своим мнением.

Ralf Meier

Я согласен с Грэмом. Этот код не имеет ничего общего с первоначальным вопросом (почти 2 года назад).

Рейтинг:
0

clwprogrammer

есть что попробовать.
это не совсем приостановка таймера, просто пропуск кода до тех пор, пока он не будет выполнен.

'set a global variable
Public PassOver as Boolean = False


затем в коде, который запускает таймер, используйте следующее:

if PassOver = false then
   PassOver = true
   'place code to fire here
   PassOver = False
end if


Рейтинг:
0

Patrice T

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

Вам нужна постоянная переменная для хранения статуса программы.

If Busy Then Return
End If
Busy = True

' do your stuff here

Busy= False


Sergey Alexandrovich Kryukov

О каком классе таймера вы говорите?
—СА

Patrice T

Для меня таймер связан с RTC.
С окнами, словом таймер это обертка для чего-то довольно сложного.