在不阻塞 GUI 线程的情况下向 WPF windows 添加控件
Adding controls to WPF windows without blocking GUI thread
我正在尝试找到一种方法来向 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.
还有其他方法吗?
您应该使用虚拟化和加载控件,因为您需要显示它们 - 这样可以减少加载控件所需的时间,因为您一次只显示几个控件。
查看这个演示虚拟化 Canvas 控件的示例。 Microsoft Virtualized WPF Canvas
还有这个 post 更多虚拟化技术参考:Resources and guides to UI virtualization in WPF
我正在尝试找到一种方法来向 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.
还有其他方法吗?
您应该使用虚拟化和加载控件,因为您需要显示它们 - 这样可以减少加载控件所需的时间,因为您一次只显示几个控件。
查看这个演示虚拟化 Canvas 控件的示例。 Microsoft Virtualized WPF Canvas
还有这个 post 更多虚拟化技术参考:Resources and guides to UI virtualization in WPF