ObservableCollection方法add()阻塞

本文关键字:阻塞 add 方法 ObservableCollection | 更新日期: 2023-09-27 18:03:00

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

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

我的问题是,这个函数是阻塞的,而项目被添加到我的列表框,我不能选择任何只有在生成完成后(也程序冻结)。

知道我该怎么做才能使这个函数异步吗?

谢谢。

ObservableCollection方法add()阻塞

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上观察。

->线程池vs.s创建自己的线程

像这样?:

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

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