我在我的wpf应用程序中使用treeview。子元素必须在后台线程中加载。
我应该用什么来完成这项任务?背景工作者?我该怎么改写呢?我的viewmodel是:
public class SpaceObjectViewModel : TreeViewItemViewModel
{
private SpaceObject mSpaceObject;
private BackgroundWorker mBackgroundWorker;
public SpaceObjectViewModel(SpaceObject spaceObject, SpaceObjectViewModel parentViewModel)
: base(parentViewModel, true)
{
mSpaceObject = spaceObject;
}
public string Name
{
get { return mSpaceObject.Name; }
}
protected override void LoadChildren()
{
foreach (SpaceObject space in DataManager.Instance.Read(mSpaceObject.ObjectId))
base.Childrens.Add(new SpaceObjectViewModel(space, this));
}
}
答案 0 :(得分:2)
在.net 4.5中,您可以像这样使用async / await:
protected async override void LoadChildren()
{
foreach (SpaceObject space in await Task.Run(() => DataManager.Instance.Read(mSpaceObject.ObjectId)))
base.Childrens.Add(new SpaceObjectViewModel(space, this));
}
由于签名中需要await
async
。
Task.Run(() => ...)
将指定的工作排队到ThreadPool上并返回该工作的任务或任务(TResult)句柄。