代码之家  ›  专栏  ›  技术社区  ›  Theofanis Pantelides

非UI线程,UI访问

  •  1
  • Theofanis Pantelides  · 技术社区  · 14 年前

    不过,我刚刚发现了一些代码,它们毫无例外地从非UI线程获取listview virtualize的值。

    所以我的问题是:

    谢谢你 西奥

    2 回复  |  直到 14 年前
        1
  •  5
  •   Pieter van Ginkel    14 年前

    因为它没有抛出异常,并不意味着你应该这样做。

    问题是除了 Invoke 对于更新UI的方法的需求,这些控件也不支持多线程。这意味着,当用户界面线程在检索数据时更新数据时,会得到损坏的数据。

        2
  •  3
  •   Hans Passant    14 年前

    具体的规则是,不能调用使用窗口句柄的Windows API函数。使用属性或调用控件的方法是否最终会进行这样的API调用,这并不十分明显。MSDN文档只列出了其中4个始终可以安全使用:InvokeRequired、Invoke()、BeginInvoke()和CreateGraphics()。

    但是是的,有时属性值是可用的,不需要API调用。文本属性是一个很好的例子。它之所以被缓存是因为它经常被使用。 阅读 写作 文本属性变为kaboom,更新屏幕上的文本需要一个API调用。VirtualSize的工作方式完全相同。

    你没有得到例外,但这仍然是不洁的。毕竟,UI线程也可能在一微秒后更改文本属性。您将得到一个过时的值,这是一个典型的线程问题,称为争用条件。