Обработчик событий истекшего времени в WPF VB.NET

Я внедряю таймер в свою программу, которая запускается при нажатии кнопки. По истечении времени я намерен закрыть программу; однако я получаю исключение недопустимой операции. У меня есть другая часть моей программы, также использующая операцию 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте использовать 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) 

В настоящее время он появляется только в Application.xaml в StartupUri. Я получаю сообщение об ошибке: «System.InvalidOperationException:«Вызывающий поток не может получить доступ к этому объекту, поскольку им владеет другой поток». Это исключение изначально было вызвано в этом стеке вызовов: [Внешний код] {namespace}.Password.TimedEvent(Object, System.Timers.ElapsedEventArgs) в Password.xaml.vb [Внешний код] " Кроме того, Application.Current.Shutdown() не работал. Получил ту же ошибку.

c0de_m00se 22.03.2022 09:42

Это означает, что класс, содержащий операцию закрытия, создается в другом потоке. Попробуйте использовать событие из класса Password, которое срабатывает в MainWindow, и здесь вызовите Close() или Shutdown().

Giuseppe Pistorino 22.03.2022 10:30

или вы можете попробовать Me.Dispatcher.Invoke(Sub() Application.Current.Shutdown() End Sub)

Giuseppe Pistorino 22.03.2022 10:42

Я попытался сделать это через MainWindow и получил «Ссылка на объект не указывает на экземпляр объекта». Я создал новый экземпляр пароля в MainWindow с именем newPass, и в ошибке говорится, что «newPass был ничем».

c0de_m00se 22.03.2022 10:46

Me.Dispatcher.Invoke(Sub() Application.Current.Shutdown() End Sub) у меня сработало!!

c0de_m00se 22.03.2022 10:50

Me.Dispatcher.Invoke(Sub() Application.Current.Shutdown() End Sub) у меня сработало!! это здорово

Giuseppe Pistorino 22.03.2022 10:51

Другие вопросы по теме