VB.Net: таймер и обработчик событий влияют друг на друга - PullRequest
0 голосов
/ 14 сентября 2018

В форме Windows у меня есть:

  • таймер tmrBackup , который регулярно выполняет резервное копирование локальной базы данных
  • ипроцедура события, которая вызывает процедуру ImportNewFile , когда FileSystemWatcher обнаруживает новый файл в заданном каталоге.

Каждый из них работает идеально, если они нене мешают друг другу.

Я пытаюсь предотвратить это, остановив FileSystemWatcher при запуске резервного копирования и снова запустив его после завершения.

С другой стороны, я установил tmrBackup.Stop () в начале ImportNewFile , затем содержимое файла преобразуется в запись в локальной базе данных.В конце ImportNewFile Я снова установил tmrBackup.Start () .Но таймер никогда не запускается снова, так что, похоже, это нереально.

Когда я не устанавливаю tmrBackup.Stop () , хотя,Я вижу странное поведение во время отладки: когда где-то в ImportNewFile срабатывает таймер, кажется, что обе подпрограммы работают параллельно: одна строка в tmrBackup процедура выполняется, затем VB.Net возвращается к ImportNewFile для одной строки, затем к таймеру и т. Д.

Вопрос: что такоеправильный метод для работы с двумя объектами, каждый из которых может срабатывать, пока обрабатывается событие другого?Спасибо!

1 Ответ

0 голосов
/ 14 сентября 2018

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

Когда код окружен SyncLock, выполнение остановится и будет ждать до входа в блок SyncLock, пока не будет завершен любой другой связанный код SyncLock. Чтобы связать их, нужно дать оператору SyncLock объект для синхронизации. Если два блока SyncLock синхронизируются с одним и тем же объектом, то ни одному из этих двух блоков кода никогда не будет разрешено работать одновременно.

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

Public Class SyncLockExample
    Private WithEvents object1 As MyType1
    Private WithEvents object2 As MyType2
    Private syncObj As New Object()

    Private Sub object1_MyEvent1(Object sender, EventArgs e) Handles object1.MyEvent1
        SyncLock syncObject
            ' Do something that can't happen at the same time as object2_MyEvent2
        End SyncLock
    End Sub

    Private Sub object2_MyEvent2(Object sender, EventArgs e) Handles object2.MyEvent2
        SyncLock syncObject
            ' Do something that can't happen at the same time as object1_MyEvent1
        End SyncLock
    End Sub
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...