是什么导致我的WPF UI无法响应?

时间:2012-09-21 19:08:37

标签: sql wpf multithreading user-interface

我是一名wpf新手,所以请原谅任何不合适的事情......

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

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

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

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

在这个帖子中,我有一个while循环,可以做一些可能导致我的UI窗口无响应的事情:

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

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

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

    根据我的例子,您认为UI没有响应是什么?可能是......

    1. 循环遍历数据库返回的每一行的while循环?

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

    3. 我的线程的启动方式,睡眠并由xaml.cs代码中的实例创建?

2 个答案:

答案 0 :(得分:0)

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

尝试一些建议:

  1. 减少项目数量
  2. 使用VirtualizingStackPanel来阻止UI更新看不见的项目

答案 1 :(得分:0)

您也可以使用Paginator加载项目。这对管理大量信息的应用程序非常有用。