我正在运行后台线程从数据库中获取数据,以便当前线程(UI)不冻结。我正在使用TPL来实现这一点。如何使父线程等待子线程完成 - C#
List<string> _myList1, _myList2;
private void LoadCollections(){
Task db_task = new Task(() => CallDB());
var continuations = db_task.ContinueWith((ant) =>
{
_myList1 = GetDataFromMetaData1();
_myList2 = GetDataFromMetaData2();
});
db_task.Start();
LoadTemplates(); //execute only after 'db_task' completes execution
}
在上面的代码
CallDB()
- 获取从在元数据数据库中,并将其存储的数据。在这种情况下,请考虑它是一个字符串列表。 (说List<string> MetaStrings
)
GetDataFromMetaData1()
和GetDataFromMetaData2()
- 获取2个单独的名单,这是MetaStrings
子目录。
现在我只希望在加载_myList1
和_myList2
之后,即db_task
已经完成执行之后,执行函数LoadTemplates
。目前,我正在使用这个
while(_mylist1==null && _mylist2==null)
Thread.Sleep(50);
LoadTemplates();
但是,当UI线程进入睡眠状态时,这显然会冻结UI。那么任何人都可以提出一种有效的方法来处理这种情况?
PS:LoadTemplates()
初始化一些ObservableCollection
变量。如果在子线程中调用LoadTemplates()
,则db_task
则引发以下错误This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread
。因此产生了线程等待的情况。
不能使用异步&等待? – terrybozzio 2014-10-19 23:28:32
实际上'LoadCollections'函数是一个信使事件。换句话说,当用户点击UI上的一个按钮时,ViewModel注册来调用'LoadCollections'。所以在这种情况下,我有点失落了如何使用async/await。 – SohamC 2014-10-19 23:32:10
不能使用Task.WaitAll(任务); – user1274820 2014-10-20 00:04:18