在不阻止GUI线程的情况下向WPF窗口添加控件

时间:2015-08-24 09:13:30

标签: c# wpf multithreading user-interface blocked

我正在尝试找到一种方法来向WPF GUI添加多个(100多个具有大量数据)控件,而不会自行阻止GUI线程。这就是我目前创建控件的方式:

我在并行线程中创建控件异步,我可以将它们添加到GUI中,但是当涉及到container.Children.Add()时,GUI被阻止。

我的第一次尝试是通过异步方法中的任务创建它们。

var a = Task.Factory.StartNew(() =>
{
    foreach (UserElement element in userElements)
        this.Dispatcher.Invoke(() => { UserElementsContainer.Children.Add(element); });
});
await a; //Won't work with or without await.

还有其他办法吗?

1 个答案:

答案 0 :(得分:4)

您应该使用虚拟化和加载控件来显示它们 - 这样可以减少加载控件所需的时间,因为您一次只显示几个。

查看此示例演示虚拟化Canvas控件。 Microsoft Virtualized WPF Canvas

还有更多虚拟化技术参考的其他帖子:Resources and guides to UI virtualization in WPF