Я внедряю таймер в свою программу, которая запускается при нажатии кнопки. По истечении времени я намерен закрыть программу; однако я получаю исключение недопустимой операции. У меня есть другая часть моей программы, также использующая операцию Close(), но даже если я удалю ее из программы, она все равно выдаст ошибку. Как я могу заставить его работать правильно?
Public Class Password
Public timer1 As System.Timers.Timer = New System.Timers.Timer()
Public loginAttempts As Integer = 0
Private myPassword As String = "MPCgso4char"
Private Sub AcceptButton_Click(sender As Object, e As RoutedEventArgs)
wrongPass.Content = "Incorrect password. Please try again."
wrongPass.Visibility = Visibility.Hidden
Select Case passTextBox.Text
Case = myPassword
Close()
Case = ""
wrongPass.Content = "Please enter a valid password."
wrongPass.Visibility = Visibility.Visible
Case <> myPassword
wrongPass.Visibility = Visibility.Visible
End Select
End Sub
Private Sub DeclineButton_Click(sender As Object, e As RoutedEventArgs)
passTitle.Visibility = Visibility.Hidden
AcceptButton.Visibility = Visibility.Hidden
DeclineButton.Visibility = Visibility.Hidden
showPass.Visibility = Visibility.Hidden
passTextBox.Visibility = Visibility.Hidden
If wrongPass.Visibility = Visibility.Visible Then
wrongPass.Visibility = Visibility.Hidden
End If
decBtnClickEvent.Visibility = Visibility.Visible
timer1.Interval = 1500
timer1.Enabled = True
timer1.Start()
AddHandler timer1.Elapsed, AddressOf TimedEvent
End Sub
Private Sub passTextBox_TextChanged(sender As Object, e As TextChangedEventArgs)
wrongPass.Visibility = Visibility.Hidden
End Sub
Private Sub showPass_Checked(sender As Object, e As RoutedEventArgs)
End Sub
Private Sub TimedEvent(sender As Object, e As System.Timers.ElapsedEventArgs)
Close()
End Sub
Private Sub Enter(sender As Object, e As KeyEventArgs) Handles passTextBox.KeyDown
If e.Key = Key.Enter Then
AcceptButton_Click(Nothing, Nothing)
Else
Exit Sub
End If
End Sub
End Class
Попробуйте использовать Application.Current.Shutdown()
вместо Close()
Private Sub TimedEvent(sender As Object, e As System.Timers.ElapsedEventArgs)
Application.Current.Shutdown()
End Sub
Кроме того, убедитесь, что ваш Public Class Password
не находится в другой теме.
В этом случае вы можете использовать:
Me.Dispatcher.Invoke(Sub() Application.Current.Shutdown() End Sub)
Это означает, что класс, содержащий операцию закрытия, создается в другом потоке. Попробуйте использовать событие из класса Password, которое срабатывает в MainWindow, и здесь вызовите Close() или Shutdown().
или вы можете попробовать Me.Dispatcher.Invoke(Sub() Application.Current.Shutdown() End Sub)
Я попытался сделать это через MainWindow и получил «Ссылка на объект не указывает на экземпляр объекта». Я создал новый экземпляр пароля в MainWindow с именем newPass, и в ошибке говорится, что «newPass был ничем».
Me.Dispatcher.Invoke(Sub() Application.Current.Shutdown() End Sub) у меня сработало!!
Me.Dispatcher.Invoke(Sub() Application.Current.Shutdown() End Sub) у меня сработало!! это здорово
В настоящее время он появляется только в Application.xaml в StartupUri. Я получаю сообщение об ошибке: «System.InvalidOperationException:«Вызывающий поток не может получить доступ к этому объекту, поскольку им владеет другой поток». Это исключение изначально было вызвано в этом стеке вызовов: [Внешний код] {namespace}.Password.TimedEvent(Object, System.Timers.ElapsedEventArgs) в Password.xaml.vb [Внешний код] " Кроме того, Application.Current.Shutdown() не работал. Получил ту же ошибку.