在后台创建复杂的WPF窗口

时间:2011-10-29 17:19:27

标签: c# wpf multithreading background

我有一个用WPF创建的非常复杂的窗口。

由于加载需要很长时间(大约10秒),我想在启动应用程序后在后台创建窗口。

我的外壳包含一个按钮,当用户点击它时,将使用此窗口。想法是加载应用程序,此按钮被禁用。加载后,我的复合体将在后台创建。创建窗口后,我可以启用此按钮,用户可以使用它。

但非常重要的是,应用程序不会阻止,而窗口将在后台创建。用户应该能够在这段时间内使用其他模块。

有人知道达到目标的方法吗?

也许有人知道,如果有更多的可能性在下一个.NET-Framework 4.5中实现这一目标?

2 个答案:

答案 0 :(得分:0)

使用BackgroundWorker

请注意,您无法在BackgroundWorker中创建实际窗口。需要在UI线程上创建窗口。但您可以在BackgroundWorker中加载所有必要的数据,并在加载后使用表单中的数据。

答案 1 :(得分:0)

您可以在后台线程中创建窗口。你需要注意的事情是:

  1. 线程必须是STA,并且应该是后台线程,因此如果主应用程序线程被终止,它将被终止。
  2. 你必须保持后台线程活着,否则你会失去你的窗户。
  3. 当引用其他GUI元素时,如果该GUI元素来自另一个线程,则应使用Dispatcher.Invoke或Dispatcher.BeginInvoke。
  4. 以下是在后台线程中创建窗口的示例:

            Thread thread = new Thread(() =>
            {
                Window windowInAnotherThread = new Window();
                windowInAnotherThread.Show();
                System.Windows.Threading.Dispatcher.Run();
            }) { IsBackground = true };
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();