WPF线程如何搞?多线程如何写入ObservableCollection

lilei_new 2015-11-02 10:45:45

namespace WpfApplication1.VM
{
class MainWindow
{
Random rd = new Random();

private System.Collections.ObjectModel.ObservableCollection<Person> _persons;

public System.Collections.ObjectModel.ObservableCollection<Person> Persons
{
get { return _persons; }
}

private DelegateCommand _refresh;

public DelegateCommand Refresh
{
get { return _refresh; }
}

public MainWindow()
{
_persons = new System.Collections.ObjectModel.ObservableCollection<Person>();
_refresh = new DelegateCommand();
_refresh.Func = o => true;
_refresh.ExecuteCommand = o =>
{
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
System.Threading.Thread.Sleep(5000);
var p = new Person(string.Empty) { Name = "testUser" };
p.TrackId = rd.Next(-5, 5) > 0 ? "hello" : string.Empty;
_persons.Add(p);
});

};
}
}


“System.NotSupportedException”类型的第一次机会异常在 PresentationFramework.dll 中发生

多线程如何写入ObservableCollection<T>?
...全文
519 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel6709 2015-11-03
  • 打赏
  • 举报
回复
Dispatcher.Invoke(new Action(()=>{   _persons.Add(p);  }));
lilei_new 2015-11-03
  • 打赏
  • 举报
回复
3楼,解决了这个问题,能讲一下原理吗?
runerback 2015-11-03
  • 打赏
  • 举报
回复
没有跨线程,应该不是这个问题吧。Add也没问题。估计问题出在Command上,没代码看不出来
lilei_new 2015-11-03
  • 打赏
  • 举报
回复
这个代码不是窗体的代码。所以没有Dispatcher.Invoke可供调用
exception92 2015-11-03
  • 打赏
  • 举报
回复
private readonly Dispatcher _dispatcher = Dispatcher.CurrentDispatcher; _dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { //TODO: }));
Poopaye 2015-11-02
  • 打赏
  • 举报
回复
你确定是Add的问题?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧