在你将我的问题标记为重复之前,请听我说.
大多数人都在进行长时间运行的非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)