Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Стоит ли деелать lock в таймере? / 16 сообщений из 16, страница 1 из 1
12.05.2015, 14:09
    #38956464
vlsaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
Типа так:
Код: 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
12.05.2015, 14:14
    #38956473
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
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
12.05.2015, 16:10
    #38956681
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
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
12.05.2015, 17:17
    #38956746
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
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
12.05.2015, 18:59
    #38956821
vlsaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
Почему не Stop - Start?
...
Рейтинг: 0 / 0
12.05.2015, 21:15
    #38956874
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
vlsafПочему не Stop - Start?
судя по документации это одно и то же
Я просто по инерции придерживаюсь VB6 стиля.
...
Рейтинг: 0 / 0
13.05.2015, 10:55
    #38957136
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
Дмитрий77vlsafМожет получиться, что MyMetod() будет работать дольше, чем вызов по таймеру. Что получится?
Вот чтобы об этом не думатьа чо тут думать? в vb6 таймер это оконное сообщение WM_TIMER, обработка оконной происходит в том же потоке, что и программный код, следовательно таймер не тикнет, пока код не отработает.

в дотнете два вида таймера, один оконный, второй поточный. первый, соответственно, ведет себя как в vb6, второй тикает независимо от основного потока.
...
Рейтинг: 0 / 0
13.05.2015, 15:52
    #38957687
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
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
13.05.2015, 17:46
    #38957853
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
...
Рейтинг: 0 / 0
14.05.2015, 09:14
    #38958220
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
Дмитрий77,

даже выключение таймера не является гарантией от двойного срабатывания.
Если интервал будет маленьким, а система в это время занята чем-нибудь -
Вполне могут сгенерироваться два события таймера и стать в очередь сообщений.
То есть, будет высокая вероятность, что таймер не сработает два раза. Но не абсолютная.
...
Рейтинг: 0 / 0
14.05.2015, 09:17
    #38958228
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
Дмитрий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
14.05.2015, 09:55
    #38958281
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
D129Попробуй MessageBox.Show(....)
Будет аналогично. Если бы MessageBox блокировал очередь сообщений родительского окна, то он бы блокировал и WM_PAINT в том числе, и при перемещении окна мэссиджбокса над родительским, последнее бы не перерисовывалось - однако этого не происходит. Как сказано выше по ссылке, окно MessageBox'а имеет свой message loop, который часть сообщений рекурсивно транслирует в WndProc родительского окна.
...
Рейтинг: 0 / 0
14.05.2015, 11:27
    #38958417
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
а не проще создать Task\Поток и в нём в конце метода задать паузу в 5 секунд?
а через IProgress информировать UI об результатах выполнения или еще как, через Invoke, Dispatcher и т.д.
...
Рейтинг: 0 / 0
14.05.2015, 11:44
    #38958437
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
Roman Mejtesа через IProgress информировать UI об результатах выполнения или еще как, через Invoke, Dispatcher и т.д.
А здесь такая задача изначально и не ставилась, про UI завели речь в контексте обсуждения, нужно ли отключать при выполнении длинной блокирующей операции таймер, чтобы предотвратить повторный вход в обработчик тика, если этот таймер оконный (ответ: не нужно, если операция действительно блокирующая - которой показ модального диалога не является).
...
Рейтинг: 0 / 0
14.05.2015, 12:03
    #38958459
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стоит ли деелать lock в таймере?
D129Дмитрий77,

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

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


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


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