【问题标题】:Assign a ui element to another ui element from another thread in C# [duplicate]将一个ui元素分配给C#中另一个线程的另一个ui元素[重复]
【发布时间】:2017-04-27 17:54:56
【问题描述】:

我想用 c# 代码以编程方式在 wpf 中制作一个网格元素,因为它需要一个巨大的处理,所以我使用了一个线程。现在当我想分配它时,Visual Studio 说:

"调用线程无法访问该对象,因为不同的 线程拥有它。”

我的代码是这样的:

PrepareGrid gridMaker = new PrepareGrid();
Thread fetchGrid = new Thread(() => {
    GridContainer.Dispacher.Invoke(() => GridContainer.Content = gridMaker.getGrid());
});
fetchGrid.SetApartmentState(ApartmentState.STA);
fetchGrid.Start();

PrepareGrid 是一个准备网格的类,它的getGrid 的方法返回结果网格,GridContainer 是一个 WPF 滚动查看器

我使用了嵌套调度程序,但它不起作用


为什么我不能将Task 用于 wpf 元素?制作网格的过程非常庞大,据我所知Thread 只使用了一个处理器核心

【问题讨论】:

  • 我很好奇:您有没有任何努力自己研究这个问题?底线:WPF UI 对象必须在使用它们的同一线程中创建。但还有底线:无论如何,您都不应该在代码隐藏中创建 UI 对象。 WPF 有一个非常有用且高效的数据绑定模型,您可以通过在后台线程中创建 data 对象,然后在完成后更新 UI 线程中的 UI 来利用它。 .如果更新仍然很耗时,您可以采取措施逐步进行更新,以便 UI 保持响应。
  • @PeterDuniho 是的,我做了很多研究,但没有一个是我的实际答案,那些绑定模型是什么?
  • 对于初学者,请参阅“MVVM”。

标签: c# wpf multithreading dispatcher


【解决方案1】:

在 WPF 中,您可以有多个 UI 线程,但 UI 元素必须在创建它的线程上使用。你在另一个线程中创建它,对吧?所以你不能在默认的 UI 线程中使用它。

我怀疑“巨大的处理”根本不是来自实际 UI 对象的创建。找出“巨大处理”的确切组成,并将 that 放在另一个线程上。或者让您的其他线程在创建实际控件或控件时调用主 UI 线程。

【讨论】:

  • 网格太大了,应该插入很多元素,所以我希望程序响应,直到网格准备好并且应该创建一个网格该线程
  • @Javad 你有视图模型吗?
猜你喜欢
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 2020-06-22
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多