C# ObservableCollection方法add()阻塞

C# ObservableCollection方法add()阻塞,c#,wpf,C#,Wpf,我正在处理一个项目C&WPF,其中一些服务器通过以下方式添加到列表框: ObservableCollection<ServerObjects> servers; ServerObjects so = getServers(); servers->add(so); 我的问题是这个函数是阻塞的,当项目被添加到我的列表框中时,我只能在生成完成后才能选择任何项目,所以程序会刷新 我该怎么做才能使这个函数asynk 谢谢。像这样吗 void addServers(ObservableC

我正在处理一个项目C&WPF,其中一些服务器通过以下方式添加到列表框:

ObservableCollection<ServerObjects> servers;
ServerObjects so = getServers();
servers->add(so);
我的问题是这个函数是阻塞的,当项目被添加到我的列表框中时,我只能在生成完成后才能选择任何项目,所以程序会刷新

我该怎么做才能使这个函数asynk

谢谢。

像这样吗

void addServers(ObservableCollection<ServerObjects> ACollection)
{
    Thread T = new Thread(new ParameterizedThreadStart(MyThreadMethod));
    T.Start(ACollection);
}

void MyThreadMethod(Object obj)
{
    ServerObjects so = getServers();
    (obj as ObservableCollection).add(so);
}
服务器的加载现在在另一个线程上执行

void addServers(ObservableCollection<ServerObjects> ACollection)
{
    //For Common szenarios dont use new Thread() use instead ThreadPool.QueueUserWorkItem(..) or  the TaskFactory
    Task.Factory.StartNew(()=> this.LoadServer());
}

void MyThreadMethod(Object obj)
{
    ServerObjects so = getServers();

    // The invoke is important, because only the UI Thread should update controls or datasources which are bound to a Control
    UIDispatcher.Invoke(new Action(()=> (obj as ObservableCollection).add(so));
}
您还可以在接收时返回一个IObservable订阅TaskScheduler并在Dispatcher上观察

->
->

服务器->?你使用不安全的代码吗?@ TiGRAN:你说的不安全代码是什么意思?我是指C中的指针如何访问?让我给你看看真正的声明,它也在C++文件中完成:GCROOT MyLIST;您使用的是C++/CLI而不是C吗?你确定这就是你想要使用的吗?我假设这个集合绑定到一个UI控件。因此,启动一个线程并将非ui线程中的元素添加到集合中不是一个好主意,因为这会导致偶尔出现非法的CrossThreadException。因此,在将元素添加到列表时,必须在UI线程上重新分派。您还应该为这些szenarios硬线程创建。使用线程池oder任务并行库INSTREAD当使用WPF集合执行多线程时,值得阅读Bea关于此问题的文章。大多数情况下都是可行的,但有些情况下会出现问题: