小编Tae*_*rin的帖子

如何在长时间运行*UI*操作期间刷新UI

在你将我的问题标记为重复之前,请听我说.

大多数人都在进行长时间运行的非UI操作,并且需要取消阻止UI线程.我有一个长时间运行的UI操作,必须在阻止我的应用程序的其余部分的UI线程上运行.基本上,我是DependencyObject在运行时动态构建s并将它们添加到我的WPF应用程序上的UI组件.DependencyObject需要创建的s 数取决于用户输入,其中没有限制.我有一个测试输入有大约6000 DependencyObject秒需要创建并加载它们需要几分钟.

在这种情况下使用后台工作程序的常用解决方案不起作用,因为一旦DependencyObjects由后台工作程序创建,它们就不能再添加到UI组件,因为它们是在后台线程上创建的.

我目前尝试解决方案是在后台线程中运行循环,为每个工作单元调度到UI线程,然后调用Thread.Yield()以给UI线程更新机会.这几乎可以工作 - UI线程确实有机会在操作期间多次更新自己,但应用程序仍然基本上被阻止.

在长时间运行的操作过程中,如何让我的应用程序继续更新UI并在其他表单上处理事件?

编辑:根据要求,我当前的"解决方案"的一个例子:

private void InitializeForm(List<NonDependencyObject> myCollection)
{
    Action<NonDependencyObject> doWork = (nonDepObj) =>
        {
            var dependencyObject = CreateDependencyObject(nonDepObj);
            UiComponent.Add(dependencyObject);
            // Set up some binding on each dependencyObject and update progress bar
            ...
        };

    Action background = () =>
        {
            foreach (var nonDependencyObject in myCollection)
            {
                 if (nonDependencyObject.NeedsToBeAdded())
                 {
                     Dispatcher.Invoke(doWork, nonDependencyObject);
                     Thread.Yield();  //Doesn't give UI enough time to update
                 }
            }
        };
    background.BeginInvoke(background.EndInvoke, …
Run Code Online (Sandbox Code Playgroud)

c# wpf multithreading

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

标签 统计

c# ×1

multithreading ×1

wpf ×1