相关疑难解决方法(0)

并行生成UI

我们有一个WPF应用程序,它有一个带有缓存的VirtualizingStackPanel的ListBox.不是因为它有大量的元素(通常小于20,但在极端情况下可能高达100或更多),但因为元素需要时间来生成.这些元素实际上是UIElement对象.因此应用程序动态地需要生成UIElements.

问题在于,即使虚拟化似乎有效,但应用程序仍然很难做出响应,这是一个概念验证解决方案,具有最小的"噪音".

所以我们认为,由于主要问题是我们动态生成复杂的UIElement对象,我们需要并行执行,即离线.但是我们得到一个代码需要在STA线程上运行的错误:

调用线程必须是STA,因为许多UI组件都需要这个.

这是否意味着我们无法在WPF主UI线程以外的线程上生成UI(UIElement对象)?

以下是我们的概念验证解决方案中的相关代码片段:

public class Person : ObservableBase
{
    // ...

    UIElement _UI;
    public UIElement UI
    {
        get
        {
            if (_UI == null)
            {
                ParallelGenerateUI();
            }
            return _UI;
        }
    }

    private void ParallelGenerateUI()
    {
        var scheduler = TaskScheduler.FromCurrentSynchronizationContext();

        Task.Factory.StartNew(() => GenerateUI())
        .ContinueWith(t =>
        {
            _UI = t.Result;
            RaisePropertyChanged("UI");
        }, scheduler);
    }

    private UIElement GenerateUI()
    {
        var tb = new TextBlock();
        tb.Width = 800.0;
        tb.TextWrapping = TextWrapping.Wrap;
        var n = rnd.Next(10, 5000);
        for (int i = 0; i …
Run Code Online (Sandbox Code Playgroud)

c# parallel-processing wpf xaml task-parallel-library

1
推荐指数
1
解决办法
6474
查看次数