powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Стоит ли деелать lock в таймере?
16 сообщений из 16, страница 1 из 1
Стоит ли деелать lock в таймере?
    #38956464
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типа так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
static object obj = new object();

static void OnTimed(object source, ElapsedEventArgs e)
{
    lock (obj)
    {
        MyMetod();
    }
}

Может получиться, что MyMetod() будет работать дольше, чем вызов по таймеру. Что получится? Скопиться некая очередь на выполение метода? Или нет?
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38956473
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://msdn.microsoft.com/en-us/library/system.timers.timer.elapsed(v=vs.110).aspx
If the processing of the Elapsed event lasts longer than Interval, the event might be raised again on another ThreadPool thread. In this situation, the event handler should be reentrant.
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38956681
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlsafТипа так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
static object obj = new object();

static void OnTimed(object source, ElapsedEventArgs e)
{
    lock (obj)
    {
        MyMetod();
    }
}


Может получиться, что MyMetod() будет работать дольше, чем вызов по таймеру. Что получится? Скопиться некая очередь на выполение метода? Или нет?
А вы стопайте таймер перед исполнением, и стартуйте его после
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38956746
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlsafМожет получиться, что MyMetod() будет работать дольше, чем вызов по таймеру. Что получится?
Вот чтобы об этом не думать (если понятно что процедура может затянуться), я со времен VB6 всегда делаю типа так.
В VB6 кстати кажется пофиг, а вот в .Net кажется не пофиг.
Но это точно безобидный вариант.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
  Private Sub TimerPOP3_Tick(sender As Object, e As EventArgs) Handles TimerPOP3.Tick
      TimerPOP3.Enabled = False
      GetMail(.m_POP3UserLogin, .m_POP3UserPassword, .m_POP3Server, CStr(.m_POP3Port))
      MessageProcess()
      TimerPOP3.Interval = .m_POP3Timeout * 1000
      TimerPOP3.Enabled = True
  End Sub


Собственно вам уже подсказали выше.
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38956821
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему не Stop - Start?
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38956874
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlsafПочему не Stop - Start?
судя по документации это одно и то же
Я просто по инерции придерживаюсь VB6 стиля.
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38957136
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77vlsafМожет получиться, что MyMetod() будет работать дольше, чем вызов по таймеру. Что получится?
Вот чтобы об этом не думатьа чо тут думать? в vb6 таймер это оконное сообщение WM_TIMER, обработка оконной происходит в том же потоке, что и программный код, следовательно таймер не тикнет, пока код не отработает.

в дотнете два вида таймера, один оконный, второй поточный. первый, соответственно, ведет себя как в vb6, второй тикает независимо от основного потока.
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38957687
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyв vb6 таймер это оконное сообщение WM_TIMER, обработка оконной происходит в том же потоке, что и программный код
в дотнете два вида таймера, один оконный, соответственно, ведет себя как в vb6

Так то оно так.
Попробуй вот этот код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Public Class Form1

  Dim count As Integer = 0

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    Timer1.Interval = 5000
    Timer1.Enabled = True
  End Sub

  Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    count = count + 1
    Dim m_count As Integer = count
    MsgBox(m_count)
    Debug.Print(m_count & " is ended")
  End Sub
End Class



Каждые 5 секунд будет по msgbox-у. Предыдущие можно не закрывать. Что интересно, каждый следующий msgbox будет модальным относит. предыдущего.
Как объяснишь?
Вроде и WM_TIMER, и поток один.
Че он тикать то продолжает?


А вот так стопорится на время показа msgbox-а:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  Dim count As Integer = 0

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    Timer1.Interval = 5000
    Timer1.Enabled = True
  End Sub

  Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Timer1.Enabled = False
    count = count + 1
    Dim m_count As Integer = count
    MsgBox(m_count)
    Debug.Print(m_count & " is ended")
    Timer1.Enabled = True
  End Sub
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38957853
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38958220
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

даже выключение таймера не является гарантией от двойного срабатывания.
Если интервал будет маленьким, а система в это время занята чем-нибудь -
Вполне могут сгенерироваться два события таймера и стать в очередь сообщений.
То есть, будет высокая вероятность, что таймер не сработает два раза. Но не абсолютная.
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38958228
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Public Class Form1

  Dim count As Integer = 0

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    Timer1.Interval = 5000
    Timer1.Enabled = True
  End Sub

  Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    count = count + 1
    Dim m_count As Integer = count
    MsgBox(m_count)
    Debug.Print(m_count & " is ended")
  End Sub
End Class




Если каждые 5 секунд по окну - то значит, что окна не блокирующие.
Кстати - сами можете проверить - если Debug.Print(m_count & " is ended") тоже каждые 5 секунд проскакивает...

Попробуй MessageBox.Show(....)
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38958281
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129Попробуй MessageBox.Show(....)
Будет аналогично. Если бы MessageBox блокировал очередь сообщений родительского окна, то он бы блокировал и WM_PAINT в том числе, и при перемещении окна мэссиджбокса над родительским, последнее бы не перерисовывалось - однако этого не происходит. Как сказано выше по ссылке, окно MessageBox'а имеет свой message loop, который часть сообщений рекурсивно транслирует в WndProc родительского окна.
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38958417
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а не проще создать Task\Поток и в нём в конце метода задать паузу в 5 секунд?
а через IProgress информировать UI об результатах выполнения или еще как, через Invoke, Dispatcher и т.д.
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38958437
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesа через IProgress информировать UI об результатах выполнения или еще как, через Invoke, Dispatcher и т.д.
А здесь такая задача изначально и не ставилась, про UI завели речь в контексте обсуждения, нужно ли отключать при выполнении длинной блокирующей операции таймер, чтобы предотвратить повторный вход в обработчик тика, если этот таймер оконный (ответ: не нужно, если операция действительно блокирующая - которой показ модального диалога не является).
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38958459
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129Дмитрий77,

даже выключение таймера не является гарантией от двойного срабатывания.
Если интервал будет маленьким, а система в это время занята чем-нибудь -
Вполне могут сгенерироваться два события таймера и стать в очередь сообщений.
То есть, будет высокая вероятность, что таймер не сработает два раза. Но не абсолютная.При выключении таймера последующие сообщения, уже отправленные в очередь, игнорируются.
...
Рейтинг: 0 / 0
Стоит ли деелать lock в таймере?
    #38959327
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129Если каждые 5 секунд по окну - то значит, что окна не блокирующие.
Кстати - сами можете проверить - если Debug.Print(m_count & " is ended") тоже каждые 5 секунд проскакивает...
Не. свою процедуру он исправно блокирует.
Debug.Print(m_count & " is ended") будет только после закрытия своего Msgbox,
я не случайно эту хрень в тест-пример добавил.

Короче проще по-любому добавить две страховочные строчки до и после "чтобы об этом не думать". Лучше перебздеть, чем недобздеть. А думать иногда вредно.


Roman MejtesTask\Поток,IProgress,UI через Invoke, Dispatcher и т.д.
Вот зачем столько много сложных слов? Когда можно без них просто и ясно разрулить ситуацию.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Стоит ли деелать lock в таймере?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]