【问题标题】:STA Thread is not loading the Main Window in WPFSTA 线程未在 WPF 中加载主窗口
【发布时间】:2013-03-30 20:53:47
【问题描述】:

我在 App_Startup() 中加载 MainWindow。我想在加载窗口时显示进度条。但它不起作用:

void App_Startup(object sender, StartupEventArgs e)
{

    Thread bootStrapThread = new Thread(new ThreadStart(runBootStrapProcess));
    bootStrapThread.SetApartmentState(ApartmentState.STA);
    bootStrapThread.IsBackground = true;
    bootStrapThread.Start();
    _loadingProgressBar = new loadingProgressBar();
    _loadingProgressBar.ShowDialog();

}

我想从线程加载窗口:

void runBootStrapProcess()
        {
            MetadataReader mr = new MetadataReader();  
            if (currentVersionNo.Equals(remoteVersionNo))
            {
                Application.Current.Shutdown();
            }
            else
            {
                MainWindow mw = new MainWindow();
                mw.Show();
            }

            _loadingProgressBar.ShouldCloseNow = true;

        }

【问题讨论】:

  • 会发生什么?怎么了?
  • 你考虑过使用内置的SplashScreeninstead吗?
  • 应用自动关闭。

标签: c# .net wpf multithreading sta


【解决方案1】:

你可以试试这个:

void runBootStrapProcess() {
  MetadataReader mr = new MetadataReader();
  if (currentVersionNo.Equals(remoteVersionNo)) {
    Application.Current.Shutdown();
  } else {
    System.Windows.Application.Current.Dispatcher.BeginInvoke(
    new Action(
      () => {
        MainWindow mw = new MainWindow();
        mw.Show();
      }));
  }
  _loadingProgressBar.ShouldCloseNow = true;
}

当你想显示窗口时,你基本上从线程将它发送到主应用程序线程。因此,当线程退出时,这会阻止应用程序关闭,因为 MainWindow 是从主线程中显示的。

【讨论】:

    【解决方案2】:

    我怀疑窗口缺少消息泵,因为 WPF 应用程序类及其 Dispatcher 在不同的 STA 线程上运行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      相关资源
      最近更新 更多