0

我是wpf新手,所以请原谅任何听起来不对的东西...

我有一个 WPF 应用程序,它在启动时会从我的 SQL 数据库中加载许多(20000+)项,并将它们存储到在 xaml.cs 后台文件中创建的 ObservableCollection 中。

我创建了一个类,它的构造函数创建一个线程并启动线程,线程无限循环。

public StatusChanged()
    {
        Thread thread = new Thread(new ThreadStart(ThreadProc));
        thread.Start();
    }

这个线程开始的方式是在我的代码后面的主窗口中创建这个线程类的一个实例(xaml.cs)

在这个线程中,我有一个 while 循环,它做了一些可能导致我的 UI 窗口变得无响应的事情:

  1. 运行 sql 命令检查以查看数据库中任何项目的位标志是否已更改的无限 while 循环。如果没有找到,线程休眠 3 秒,循环继续

  2. 当从数据库返回行时,我遍历每一行并找到更改的属性并修改我的 ObservableCollection 以及通过为每个行运行 SQL 更新命令来修改数据库中的位标志。然后线程再次休眠 3 秒,循环继续。

这是对正在发生的事情的概述。当从数据库返回行并从第 2 点开始完成工作时,UI 可能会变得无响应。当我尝试单击一个按钮时,它通常会在 75% 以上的情况下正常工作,但有 25% 的时间 UI 没有响应并且没有任何反应。这对我的应用程序非常不利。

根据我的示例,您认为是什么导致 UI 无响应?难道是……

  1. 循环通过数据库返回的每一行的while循环?

  2. 更新该 while 循环 ^^ 内的可观察集合,并为每个项目进行 sql 更新调用。

  3. 我的线程是由 xaml.cs 代码中的实例启动、休眠和创建的方式吗?

4

2 回答 2

2

如果 20000 多个项目的 Observable 集合绑定到 UI,则在修改项目时可能需要更新 UI。这对于 UI 线程来说可能是非常昂贵的,从而导致 UI 变得无响应。

有几个建议可以尝试:

  1. 减少商品数量
  2. 使用 VirtualizingStackPanels 防止 UI 更新看不见的项目
于 2012-09-21T19:35:59.923 回答
0

您还可以使用分页器来加载项目。这对于管理大量信息的应用程序很有用。

于 2012-09-21T19:49:54.470 回答