【发布时间】:2021-01-30 23:21:09
【问题描述】:
我想了解一下 C# (WPF) 在代码背后的工作原理。 情况(为简单起见,显然是假设的):
在我们的 UI 线程上,我们创建了 Settings 对象。它有一个变量:
public ObservableCollection<Something> collection;
我们从不同的后台线程调用
try{
Settings.Modify()
}
然后执行以下操作:
Settings.Modify()
{
collection = new ObservableCollection<Something>();
collection.Add(...)
}
现在,这当然会在 Add 函数中引发异常:
这种类型的 CollectionView 不支持对其进行更改 SourceCollection 来自与 Dispatcher 线程不同的线程。
但是集合 = new ObservableCollection();行执行。据我所知,这个新集合是在后台线程的堆栈上创建的。 WPF UI 绑定到这个变量:
<ItemsControl ItemsSource="{Binding Settings.collection}"
在我的理解中,UI 线程应该不能再访问这个集合了。如果它尝试会发生什么,它会因为某种原因阻塞 UI 线程吗?
其他问题:为什么编译器让我用后台线程上的另一个对象替换一个明显属于 UI 线程的对象,即使它知道我在尝试从另一个线程添加到该集合时搞砸了.
编辑:
这个问题的解决方案已经回答here:
我仍然对此感到好奇:如果
collection = new ObservableCollection<Something>();
函数被单独调用,如果UI线程试图访问这个集合会做什么?
【问题讨论】:
-
new ObservableCollection在另一个线程中是一个问题,不要在另一个线程中这样做。您可以通过调度程序 invoke 该部分,以便它将在 UI 线程中执行。 -
它在某种意义上回答了这个问题,因为它是正确的解决方案。由于链接的问题,我已经解决了这些问题,但我仍然对此感到好奇: If the collection = new ObservableCollection
();函数被单独调用,如果 UI 线程试图访问这个集合会怎么做?
标签: c# wpf multithreading observablecollection