c# - 向 WPF 窗口添加控件而不阻塞 GUI 线程

标签 c# wpf multithreading user-interface blocked-threads

我正在尝试找到一种方法,将多个(100+,具有大量数据)控件添加到 WPF GUI,而不会自行阻塞 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.

还有别的办法吗?

最佳答案

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

查看这个演示虚拟化 Canvas 控件的示例。 Microsoft Virtualized WPF Canvas

还有另一篇文章提供更多虚拟化技术引用:Resources and guides to UI virtualization in WPF

关于c# - 向 WPF 窗口添加控件而不阻塞 GUI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32178498/

相关文章:

java - 如何正确关闭所有线程?

c++ - 多线程——在不同类的方法之间传递变量

c# - 如何获取 XML 或 XElement 变量中的特定元素计数

c# - 与 Throws<T> 方法类似的通用 DoesNotThrow<T> 方法在哪里?

c# - wpf中datagrid和grid的区别

java - 避免 Java 编译器优化循环和 if 语句

c# - 使用 PdfWriter 和 iTextSharp 以及 SetFontAndSize 函数的斜体文本

c# - 如何检查空数据表

c# - 如何从 wpf 中的代码隐藏更改控件的 Grid.Row 和 Grid.Column

c# - Windows 桌面应用程序的本地化