gpt4 book ai didi

c# - 在 WPF/C# 中生成复杂内容并将其传递给 GUI 线程

转载 作者:行者123 更新时间:2023-11-30 14:41:54 24 4
gpt4 key购买 nike

我知道并使用 xxx.Dispatcher.Invoke() 方法来获取后台线程来操作 GUI 元素。我想我遇到了一些类似但略有不同的事情,我想要一个长时间运行的后台任务来构建一个对象树,并在完成后将其交给 GUI 进行显示。

尝试这样做会导致 InvalidOperationException,“由于调用线程无法访问此对象,因为另一个线程拥有它。”奇怪的是,简单类型不会发生这种情况。

下面是一些示例代码,演示了抛出异常的简单情况。知道如何解决这个问题吗?我很确定问题是后台线程拥有工厂构造的对象,而前台 GUI 线程无法取得所有权,尽管它适用于更简单的系统类型。

private void button1_Click(object sender, RoutedEventArgs e) 
{
// These two objects are created on the GUI thread
String abc = "ABC";
Paragraph p = new Paragraph();

BackgroundWorker bgw = new BackgroundWorker();

// These two variables are place holders to give scoping access
String def = null;
Run r = null;

// Initialize the place holders with objects created on the background thread
bgw.DoWork += (s1,e2) =>
{
def = "DEF";
r = new Run("blah");
};

// When the background is done, use the factory objects with the GUI
bgw.RunWorkerCompleted += (s2,e2) =>
{
abc = abc + def; // WORKS: I suspect there's a new object
Console.WriteLine(abc); // Console emits 'ABCDEF'

List<String> l = new List<String>(); // How about stuffing it in a container?
l.Add(def); // WORKS: l has a reference to def

// BUT THIS FAILS.
p.Inlines.Add(r); // Calling thread cannot access this object
};

bgw.RunWorkerAsync();
}

问题的主要范围是我有一个正在后台动态构建的大型文档,我希望 GUI 能够显示到目前为止生成的内容,而无需等待完成。

后台 worker 如何充当对象工厂并将内容交给主线程?

谢谢!

最佳答案

您正在尝试在后台线程中创建 Run,但是 Run 是一个 FrameworkContentElement,它继承自 DispatcherObject 并因此绑定(bind)到创建它的线程。

关于c# - 在 WPF/C# 中生成复杂内容并将其传递给 GUI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3588033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com