【发布时间】: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