我正在开发一个项目(C#和WPF),其中一些服务器以这种方式添加到列表框中:
ObservableCollection<ServerObjects> servers;
ServerObjects so = getServers();
servers->add(so);
我的问题是这个功能是阻塞的,当项目被添加到我的列表框中时,我不能只在生成完成后选择任何一个(程序也会冻结)。
所以我应该怎样做才能使这个函数成为异步?
感谢。
答案 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);
}
现在在另一个线程上执行服务器的加载。