【问题标题】:How do I make this run asynchronously?如何使它异步运行?
【发布时间】:2013-10-22 02:57:56
【问题描述】:

我正在用 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;
  }
}

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

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

很明显,我不知道我在做什么任务。有谁知道如何让它做我想做的事?

【问题讨论】:

  • 在 XAML 的绑定中添加 IsAsync=True 怎么样?
  • @Nick 在任务上调用Result 会对该任务进行阻塞等待以获取其结果,从而破坏了在另一个线程中开始工作的意义。您需要让该方法实际返回一个Task,尽管我没有做足够的 WPF 来知道它是否知道如何处理这样的任务。
  • @HighCore 啊,这行得通。在异步绑定完成后,UI 仍然冻结了几秒钟,试图加载列表视图项。我将集合从 IEnumerable 更改为 IList,这让 listview 虚拟化工作得更快。问题解决了。谢谢。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多