6

我有一个 Windows 窗体,包含一个文本框和一个 datagridview。一旦文本框的文本发生更改,datagridview 的数据源就会更新。例如,它是通过处理文本框的 TextChanged 事件并为数据源分配一个新列表来完成的。通常新数据源包含1000+行,数据量相当大。此外,查询数据库以获取此列表也很耗时。

令我惊讶的是,如果我在文本框中输入的速度足够快,数据网格会一次又一次地暂停呈现自己,它只会呈现最终结果。它完全忽略了中间结果。这是有道理的,因为在连续文本更改期间正在运行的 UI 线程很忙。但是为什么我仍然可以在文本框中输入?

  1. 文本变化
  2. 获取数据
  3. 刷新 DataGridView(无渲染/绘画)
  4. 文本变化
  5. 获取数据
  6. 刷新 DataGridView(无渲染/绘画)
  7. ...文本更改
  8. 获取数据
  9. 刷新 DataGridView(最终渲染/绘画)
  10. 完毕。

就像文本框在另一个线程上一样,但绝对不是。有人知道为什么吗?

4

1 回答 1

6

这不是 DataGridView 特有的,任何 Windows 窗口都会自动具有此功能。它由消息队列提供,消息队列是一种与显示窗口的线程相关联的数据结构。当线程忙于做其他事情时,Windows 会在输入事件(如鼠标按钮单击或键盘按键按下)上将消息添加到队列中。

一旦线程完成它正在做的事情,它就会重新进入消息循环(由 Application.Run() 启动的循环),从队列中检索消息并处理它。哪个轮次会触发 TextChange 事件。因此,将队列可视化的一个好方法是作为缓冲区。默认情况下,它最多可以存储 10,000 个事件。

于 2012-12-26T20:47:54.140 回答