VB.NET и WPF SplashScreen с System.Threading.Thread - PullRequest
0 голосов
/ 15 сентября 2018

Следующий код - C # и Windows Forms, и он окей.

Следующий код взят из этого видео на YouTube: Учебное пособие по C # - Заставка

namespace SplashScreen
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            Thread t = new Thread(new ThreadStart(StartForm));
            t.Start();
            Thread.Sleep(5000);
            InitializeComponent();
            t.Abort();
        }

        public void StartForm()
        {
            Application.Run(new frmSplashScreen());
        }
    }
}

Следующий код VB.NET и Windows Forms, и это нормально.

Class MainWindow

    Private Sub Button1_Click(sender As Object, e As RoutedEventArgs) _
      Handles Button1.Click

        Dim t As System.Threading.Thread = _
          New System.Threading.Thread(AddressOf StartForm)
        t.Start()
        System.Threading.Thread.Sleep(5000)
        t.Abort()
    End Sub

    Public Sub StartForm()
        Application.Run(New frmSplashScreen)
    End Sub

End Class

Я хочу преобразовать приведенный выше код в приложение VB.NET и WPF.

Необходимо исправить следующий код.

Class MainWindow

    Private Sub Button1_Click(sender As Object, e As RoutedEventArgs) _
      Handles Button1.Click

        Dim t As System.Threading.Thread = _
          New System.Threading.Thread(AddressOf StartForm)
        t.Start()
        System.Threading.Thread.Sleep(5000)
        t.Abort()
    End Sub

    Public Sub StartForm()
        Dim mySplashScreenWindow As New SplashScreenWindow()
        mySplashScreenWindow.Owner = Me
        mySplashScreenWindow.ShowDialog()
    End Sub
End Class

Вот сообщение об ошибке:

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

Вот снимок экрана с ошибкой: https://prnt.sc/kumom7

1 Ответ

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

Вы должны вызвать свой код StartForm, используя dispatcher.

Так что ваш StartForm должен выглядеть так:

Public Sub StartForm()
    Application.Current.Dispatcher.Invoke(Sub()
        Dim mySplashScreenWindow As New SplashScreenWindow()
        mySplashScreenWindow.Owner = Me
        mySplashScreenWindow.ShowDialog()
    End Sub)
End Sub

Вы должны прочитать Понимание и использование моделей потоков COM для лучшего понимания потоков и STA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...