【问题标题】:Does reading data from a UI thread require invoke?从 UI 线程读取数据是否需要调用?
【发布时间】:2015-10-28 17:17:38
【问题描述】:

我了解从另一个线程更新 UI 需要调用,但仅从 UI 读取数据时是否也需要调用?

例如,如果基于在大型网格中找到的数据运行计算,在读取网格中找到的值并将它们分配给计算中使用的变量时是否需要调用网格?

如果没有,为什么不呢?

是这样,有性能问题吗?将所有数据缓存到数组(或数据表)然后运行计算,还是在每次读取数据时(例如,在每一行)调用网格更好?

我特意询问的是 VB.NET,但我怀疑其他任何 .NET 语言之间是否存在很大差异。

【问题讨论】:

  • 你不应该问这个问题。当您的线程在完全随机的时间点读取属性时,您期望获得什么值?当您允许用户继续编辑网格内容时,可以是任何东西。可能是半输入值。你会惊呼“我要禁用网格!”是的,这是个好主意。但是你不必再解决这个问题,因为你可以简单地读取你需要的值之前你开始线程。
  • 你是对的,我可以在运行之前读取网格,因此如果不需要调用,我询问了两种方法之间的性能。但是,如果 UI 上的表已经包含这些值,为什么还要将这些值读入内存中的另一个表中呢?这对于大型表来说既繁琐又耗时。
  • UI 不是“表格”。将数据与视图分离是一种通用的编程方法,有很多好处。
  • 请原谅我的无知,但是 datagridviewselectedrowcollection 不在 UI 线程上吗?我正在从该集合中提取用户选择要分析的项目。我可以访问网格后面的主数据表,但这并不能告诉我用户选择了哪些项目。正如我之前所说,选择列表很大,所以如果可以避免的话,将选定的项目复制到单独的表不是我的首选。

标签: .net vb.net multithreading


【解决方案1】:

这完全取决于控件,有些可能让您从非 UI 线程中读取,有些可能不会。

该问题的最佳解决方案是不要直接从控件中读取,有一些保存数据的支持对象,然后使用绑定让控件使用来自支持对象的数据。这是MVVM(模型、视图、视图模型)背后的基本前提,这是 WPF 中非常流行的模式,但也可以在 Winforms 中使用。

【讨论】:

    【解决方案2】:

    没有。更新 UI 需要调用,因为 UI 只能从前台线程更新。没有限制哪个线程可以读取数据。

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多