如何异步运行?

时间:2013-10-21 18:26:13

标签: c# wpf asynchronous task-parallel-library

我正在用C#编写WPF应用程序,在其中我需要在TFS中查询历史记录,并且我在列表视图中显示我得到的变更集列表。

listview ItemsSource绑定到一个名为Changesets的IEnumerable属性,在使用该属性之前不会加载该属性:

public IEnumerable<Changeset> Changesets
{
  get
  {
    if (p_nChangesets == null)
    {
      p_nChangesets = TfsHelper.VCS.QueryHistory(Path, VersionSpec.Latest, 0,
                                                 RecursionType.Full, null,
                                                 new ChangesetVersionSpec(1),
                                                 VersionSpec.Latest, int.MaxValue, 
                                                 false, true, false, false)
                                                 .OfType<Changeset>();
    }
    return p_nChangesets;
  }
}

现在发生的是当视图加载时,listview绑定到此属性,因此它立即调用属性以获取更改集的集合。有时此查询运行缓慢,因此甚至需要一段时间才能看到窗口打开。我想要发生的是立即显示窗口,列表视图为空,直到找到更改集,然后填充列表视图。但我不知道该怎么做。我尝试使用任务,但结果相同:

public IEnumerable<Changeset> Changesets
{
  get
  {
    if (p_nChangesets == null)
    {
      Task<IEnumerable> task = Task<IEnumerable>.Run(() => TfsHelper.VCS.QueryHistory(
                                                           Path, VersionSpec.Latest, 0, 
                                                           RecursionType.Full, null,
                                                           new ChangesetVersionSpec(1),
                                                           VersionSpec.Latest, int.MaxValue, 
                                                           false, true, false, false));
      p_nChangesets = task.Result.OfType<Changeset>();
    }
    return p_nChangesets;
  }
}

显然,我不知道我在做什么。有谁知道如何做到我想做的事情?

1 个答案:

答案 0 :(得分:1)

在XAML中的绑定中添加IsAsync=True

<ListView ItemsSource="{Binding ChangeSets, IsAsync=True}"/>