【问题标题】:WPF Application freezes for 20 secondsWPF 应用程序冻结 20 秒
【发布时间】:2020-10-02 01:24:41
【问题描述】:

我有一个 WPF(带 Prism 的 MVVM)应用程序

有很多因素会影响这个问题,但我会尽量简化。 希望我至少能得到一些提示如何解决这个问题。

我有一个包含数据网格和典型搜索按钮的用户控件。网格最初是空的并且在 SearchCommand 上。用户控件使用“AccountServiceGateway”类(下面的_accountSG)向服务器发出请求,然后用结果填充网格的数据源。很标准。

VM:将命令绑定到 ctor 中的处理程序

...
SearchCommand = new DelegateCommand(async () => await SearchOnServer(new AccountFilterDTO()));

VM,按钮处理程序实现

private async Task<bool> SearchOnServer(AccountFilterDTO filter)
{
   var searchAccountResults = await _accountSG.SearchAccounts(filter);
   //AccountSearchResultList  is an observable collection that is datasource for the grid
   AccountSearchResultList = new ObservableCollection<AccountSearchResultDTO>(searchAccountResults);
}

// 账户服务网关,发出网络请求

protected async Task<T> GetFromUrl<T>(string urlPart)
{
   ...
    var response = await _httpClient.GetAsync(url);
    resStr = await response.Content.ReadAsStringAsync();
    //convert to T and return
}   

编辑

当我将 GetFromUrl() 的实现替换为

await Task.Delay(5000)
return [hardcoded list of T] 

一切正常(虽然硬编码列表只有 5 项)

结束编辑

现在我的问题。正如预期的那样,从服务器获得答案大约需要 1-2 秒。我可以按照代码进行操作,直到我的数据源被填满。但是随后 GUI 在显示任何内容之前冻结了大约 (10-)20 秒,然后在冻结之后,一切都按预期进行。

需要注意的其他事情是用户控件位于棱镜区域中,在 Telerik RadTabbedWindow 内,所以如果这看起来不错,可能是别的东西。

所以我的主要问题是,为什么它会挂起 20 秒,我怀疑存在一些线程问题,但如果它出现死锁,它不会永远挂起吗?有什么办法解决这个问题?

【问题讨论】:

  • 请注意,如果您只为 AccountSearchResultList 属性创建一个新值,那么使用 ObservableCollection 是没有意义的。仅当您向现有集合实例添加或删除元素时,才需要使用 ObservableCollection。
  • 对于您的问题,如果集合中有大量元素,更新 UI 可能需要一些时间。
  • @Clemens:感谢您的回复。 (1) 是的,我添加和删除 (2) 我不想这么说,但这之前效果很好,大约 1700 行,并且在一秒钟内轻松填充)
  • 你会提到任何collectionviewsource过滤。正确的?那可能很慢。所以它工作正常。现在需要更长的时间。也许看看源代码控制历史中发生了什么变化。失败了。创建一个新的解决方案并缩小其中的范围。忘记棱镜和动态的任何东西。通过网格我猜你的意思是数据网格。只是一个带有数据网格的窗口,并移植您在此处向我们展示的代码位。看看是否可以正常工作。如果是这样,那么您的问题出在 Telerik 选项卡或 prism 的东西上。测量数据网格的安排可能需要 10-20 秒。
  • 谢谢你相信我,伙计……*啜泣*

标签: wpf mvvm async-await


【解决方案1】:

视图是否发生了某种变化,从而有效地关闭了列表虚拟化?

例如。已添加父 ScrollerViewer

【讨论】:

  • 是的,这可能与棱镜区域有关。当我从一个区域内的区域控制变为仅控制区域时,冻结就消失了。当我知道实际原因时可能会再写一次,但肯定是正确的答案(对我来说)
猜你喜欢
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多