【发布时间】:2011-11-18 08:53:25
【问题描述】:
所以我有一个带有启动画面的 WPF 应用程序 (MVVM)。在启动画面启动时,我在 ViewModel 上有一个后台线程,它执行一些与启动相关的活动。在某些情况下,我想打开几个额外的窗口(需要用户输入等......)。我在尝试执行此操作时遇到了许多问题/错误/异常(主要是围绕那个新窗口 - 也是 MVVM - 试图填充其 UI 项目,例如组合框)。所以我把这个问题拉回了一个更简单的形式——“tempWindow”没有任何东西,所以它不会引发 UI 填充错误,但基本上它只是打开它们,一旦后台线程完成,就关闭它们.如果有人能指出我在这里做错的事情的正确方向,我将不胜感激。
ViewModel 的构造函数启动一个后台线程
public SplashScreenViewModel()
{
this.LoadingStatusText = "Starting Startup Processing ... ";
this.VersionNumber = "version " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
var threadBackgroundStartUpProcesses = new Thread(new ThreadStart(this.BackgroundStartUpProcesses));
threadBackgroundStartUpProcesses.SetApartmentState(ApartmentState.STA);
threadBackgroundStartUpProcesses.IsBackground = true;
threadBackgroundStartUpProcesses.Start();
}
后台线程应该只打开三个窗口(确实如此),但这些窗口应该保持打开状态(一旦线程完成它们就会消失)。
private void BackgroundStartUpProcesses()
{
for (int i = 0; i < 3; i++)
{
var objTempWindow = new tempWindow();
objTempWindow.Show();
}
}
// 编辑:已更新响应,现在当 TempWindow 有一个从 TempWindowViewModel 填充的组合框时会出现错误。
private void BackgroundStartUpProcesses()
{
for (int i = 0; i < 3; i++)
{
var objTempWindow = new tempWindow();
objTempWindow.Show();
}
System.Windows.Threading.Dispatcher.Run();
}
当它打开 TempWindow 时出现异常:“调用线程无法访问此对象,因为不同的线程拥有它。”被抛出,并且似乎是当该窗口上的 ComboBox 试图被填充时。
【问题讨论】:
-
我最终创建了一个要创建的窗口列表,然后在启动结束时使用该窗口列表引发一个事件并通过该事件将其传递回 WPF SplashScreenView,然后在视图处理该事件,遍历视图列表并从那里打开窗口......不确定这是否是最好的,但它可以工作
标签: wpf multithreading mvvm