ObservableCollection方法add()阻塞

时间:2011-07-22 07:36:03

标签: c# wpf

我正在开发一个项目(C#和WPF),其中一些服务器以这种方式添加到列表框中:

ObservableCollection<ServerObjects> servers;
ServerObjects so = getServers();
servers->add(so);

我的问题是这个功能是阻塞的,当项目被添加到我的列表框中时,我不能只在生成完成后选择任何一个(程序也会冻结)。

所以我应该怎样做才能使这个函数成为异步?

感谢。

2 个答案:

答案 0 :(得分:1)

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));
}

您也可以在RX上返回TaskScheduler上的IObservable订阅并在Dispatcher上观察。

- &GT; Threadpool vs.s Creating own Thread - &GT; Build More Responsive Apps With The Dispatcher

答案 1 :(得分:0)

喜欢这个?:

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);
}

现在在另一个线程上执行服务器的加载。