【发布时间】:2015-09-14 11:45:53
【问题描述】:
我有一个通过 WCF 与服务器通信的 WPF 应用程序。 我在远程服务器上执行一个方法,回调方法初始化一个列表,其中包含在不同线程上运行的结果。 - 这很好,这正是我申请的目的。
但是当我想向这个列表中添加更多项目时,它会抛出一个异常,即我无法从已初始化此列表的不同线程中添加项目。
public ObservableCollection<ListBoxItemVM<T>> Items
{
get { return items; }
set
{
// This section runs on a separate thread.
items = value;
notify("Items");
if (allItems == null)
allItems = new ObservableCollection<ListBoxItemVM<T>>(items.Clone());
// I want to save the current context here and use it on the AddItem method
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(Items);
view.Filter = searchFilter;
}
}
public void AddItem(ListBoxItemVM<T>
{
this.items.Add(item); // The following exception throws here
}
例外:这种类型的 CollectionView 不支持从不同于 Dispatcher 线程的线程更改其 SourceCollection。
我正在寻找某种方法来保存用于初始化列表的线程(或线程的 ExecuteContext),并使用此线程/上下文将项目添加到该列表中。
应该提到的是,与 UI 线程无关,我在代码中的另一个区域处理了 UI 线程的封送处理。
我尝试使用 UI SynchronizationContext 编组this.items.Add(item); 代码,但购买它们是不同的,所以它失败了。
谢谢
【问题讨论】:
-
你也可以试试 'items.Dispatcher.Invoke' 而不是 'this'
-
是的,你说得对,但我确实希望这部分代码在单独的线程上运行。谢谢。
-
其实你可以在一些不同的对象中找到dispatcher,就像你之前做的this.Dispatcher,listbox.Dispatcher,还有Application.Current.Dispatcher。您是否尝试了所有这些并收到相同的错误消息?
-
我可以在我的代码中的任何区域访问 UI 调度程序,因为我已经将它保存在一个通用静态类中,我在我的代码中的许多区域使用它,这不是问题。我这里不需要。问题是列表初始化的线程是 X 并且添加项方法在线程 Y 中运行,但是我希望 Y 在添加一些项时与 X 编组。感谢您的帮助
标签: c# wpf multithreading wcf task-parallel-library