Событие, определяющее, изменился ли ряд переменных
Я создаю программу, которая будет контролировать выход внешнего процесса. У меня есть настройка таймера, которая запрашивает данные от внешнего процесса каждый тик, и результаты хранятся в моем классе. Если какая-либо из переменных изменилась по сравнению с их предыдущим состоянием, я хочу обновить результаты в базе данных. Я настроил тестовую программу, которая имитирует это, но в гораздо меньшем масштабе. На данный момент я проверяю только 3 переменные. Я настроил класс, который содержит результаты 3 переменных, и я создал свойства для каждой переменной. В каждом свойстве я вызываю событие, которое срабатывает, когда переменная меняет значение.
Затем я создал обработчик событий, который обрабатывает все 3 события. Если срабатывает одно из событий, моя база данных обновляется. Все это отлично работает, за исключением одного. Если одна переменная была изменена, она прекрасно обновляет переменную в базе данных. Если 2 переменные изменяются одновременно, событие срабатывает дважды, что обновляет базу данных 2 раза. Если все 3 переменные изменятся одновременно, база данных обновится 3 раза. Я хочу избежать перегрузки базы данных, поэтому я не хочу обновлять ее чаще одного раза за каждый тик таймера, независимо от того, изменяется ли одна переменная или все переменные. Как с этим лучше всего справиться? Единственное, что я могу придумать, - это создать одну переменную и одно свойство, содержащее все 3 результата в виде массива, списка или чего-то подобного. Это лучший вариант или мне чего-то не хватает?
Что я уже пробовал:
Public Class ClassTimerVars Private _Feedrate As Integer Public Event FeedrateChanged() Private _Spindle As Integer Public Event SpindleChanged() Private _Rapid As Integer Public Event RapidChanged() Public Property Feedrate() As Integer Get Feedrate = _Feedrate End Get Set(ByVal value As Integer) If _Feedrate <> value Then _Feedrate = value RaiseEvent FeedrateChanged() End If End Set End Property Public Property Spindle() As Integer Get Spindle = _Spindle End Get Set(ByVal value As Integer) If _Spindle <> value Then _Spindle = value RaiseEvent SpindleChanged() End If End Set End Property Public Property Rapid() As Integer Get Rapid = _Rapid End Get Set(ByVal value As Integer) If _Rapid <> value Then _Rapid = value RaiseEvent RapidChanged() End If End Set End Property End Class
Public Class Form1 Private TimerTick As Long = 0 Private WithEvents test As New ClassTimerVars Private EventsFired As Long = 0 Private Sub OverrideChanged() Handles test.FeedrateChanged, test.SpindleChanged, test.RapidChanged Me.TxtFeedrate.Text = test.Feedrate Me.TxtSpindle.Text = test.Spindle Me.TxtRapid.Text = test.Rapid EventsFired += 1 Me.LblEventsFired.Text = "Events Fired = " & EventsFired 'Update the Database here End Sub Private Sub BtnStartTimer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStartTimer.Click Timer1.Start() End Sub Private Sub BtnStopTimer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStopTimer.Click Timer1.Stop() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 'Simulate Extracting data from an external process 'Update the 3 variables on different intervals to see how many times the event is triggered TimerTick += 1 'Update Feedrate in the class If TimerTick Mod 2 = 0 Then test.Feedrate = TimerTick End If If TimerTick Mod 4 = 0 Then test.Spindle = TimerTick End If If TimerTick Mod 8 = 0 Then test.Rapid = TimerTick End If End Sub End Class
[no name]
Я думаю, что создал бы класс event args, который содержал бы все три значения.
Peter Leow
Создайте класс с 3 переменными в качестве свойств и реализуйте уведомление об изменении свойств https://msdn.microsoft.com/en-us/library/ms743695(v=против 110). aspx
theskiguy
Питер:
Я никогда раньше не использовал уведомление об изменении свойств. Можете ли вы сказать мне, в чем преимущество его использования по сравнению с тем, как я поднимаю события в своем классе?