2011-04-09 32 views
0

我有一个wpf ComboBox数据绑定到ObservableCollection,需要从Socket类中的异步函数BeginRecieve进行更新。我知道当异步函数执行时,它在一个新线程中,并且你不能通过其他线程更新主GUI控件。有人能给我举一个例子,说明这可能是如何实现的吗?如何从Socket.BeginRecieve更新C#wpf组合框?

非常感谢您的帮助。

+0

使用Dispatcher.BeginInvoke()。在搜索框中输入它。 – 2011-04-09 01:34:16

+0

@Hans Passant,对于这种场景,Invoke实际上比BeginInvoke要好。使用BeginInvoke可能会导致同步问题,我以困难的方式学习了它... – 2011-04-09 01:51:51

回答

1

您不能从另一个线程更改集合的内容,您需要在分派器线程上执行该操作。所以,与其这样:

collection.Add(item); 

这样做:

Dispatcher.Invoke(new Action(() => collection.Add(item))); 

另一种选择是使用提高了调度线程上CollectionChanged事件的集合。我发布了一个示例here