【问题标题】:c# background worker in mvvmc# mvvm 中的后台工作者
【发布时间】:2013-07-21 02:18:30
【问题描述】:

我在我的 wpf 应用程序中使用树视图。子元素必须在后台线程中加载。

我应该用什么来完成这项任务?后台工作者?我应该如何重写它?我的视图模型是:

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

【问题讨论】:

  • Bgw 可能会起作用。你查过怎么用吗?你只需要注册它的事件。
  • 您可以使用异步和等待语句。
  • Base.Children 是什么样的?

标签: c# wpf backgroundworker


【解决方案1】:

在 .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 上运行并返回该工作的任务或 Task(TResult) 句柄。

【讨论】:

    猜你喜欢
    • 2011-10-30
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多