У меня есть обработчик события нажатия кнопки, который, помимо прочего, обновляет личную, не разделяемую переменную экземпляра в содержащей ее форме.
У меня также есть System.Windows.Forms.Timer , чье событие Tick наступает через несколько секунд после завершения события нажатия кнопки.
Мой вопрос: почему обработчик событий Tick иногда (довольно часто) видит предыдущее значение этой переменной экземпляра? (Я думал, что System.Windows.Forms.Timer является поточно-ориентированным по отношению к переменным экземпляра.)
Смежный вопрос: уместно ли, что это часто происходит на очень быстром четырехпроцессорном компьютере, но редко, если вообще когда-либо на медленном двухпроцессорном? Другими словами, возможно ли, что проблема связана с синхронизацией переменных экземпляра между процессорами?
Код следует. Изменены условные обозначения для отображения красоты.
/* Instance variable get/set */
Public Property mode() As modetype
Get
Return _mode
End Get
Set(ByVal value As modetype)
_mode = value
Select Case value
/* Lots of mode-specific processing here */
End Select
Debug.Assert(mode = value)
End Set
End Property
/* Click event handler */
Private Sub btnClear_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnClear.Click
Debug.Assert(Not (picVideo Is Nothing))
mode = modetype.clear
End Sub
/* Tick event handler */
Private Sub tmrCapture_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrLiveImageCapture.Tick
// FOLLOWING LINE is where mode should be .clear but comes up as .live instead.
If mode = modetype.live Then
Debug.Assert(mode = modetype.live) // Seriously? Yes.
Try
execute_timer_tick_stuff()
Catch ex As Exception
/* Shouldn't happen */
tmrLiveImageCapture.Stop() // FIXME: can you stop a timer within its own tick event?
MessageBox.Show("Error in live timer tick: " & ex.Message)
Debug.Assert(Not tmrLiveImageCapture.Enabled)
End Try
End If
End Sub
Спасибо.