The*_*des 1 c# multithreading winforms
众所周知,您无法从UI线程以外的任何其他线程更新UI.
但是,我刚刚从没有Exception的非UI线程中发现了一些代码,它获取了listview virtualsize的值.
所以我真正的问题是:你可以从非UI线程中与UI进行什么交互?
谢谢Theo
因为它可以在不抛出异常的情况下工作,并不意味着你应该这样做.
问题是除了Invoke需要更新UI的方法之外,这些控件也不支持多线程.这意味着当UI线程在您检索数据时更新数据时,您确实会获得损坏的数据.
具体规则是不能调用使用窗口句柄的 Windows API 函数。使用属性或调用控件的方法是否最终会进行这样的 API 调用并不是很明显。MSDN 文档仅列出了其中 4 个始终可以安全使用的方法:InvokeRequired、Invoke()、BeginInvoke() 和 CreateGraphics()。
但是是的,有时属性值可用并且不需要 API 调用。Text 属性就是一个很好的例子。它被缓存是因为它经常被使用。 读取Text 属性不会产生异常,您只会获得缓存值。但是编写Text 属性会引起轰动,更新屏幕上的文本需要 API 调用。ListView.VirtualSize 的工作方式完全相同。
你没有得到例外,但它仍然不是犹太洁食。毕竟,UI 线程也可能会在一微秒后更改 Text 属性。你会得到一个陈旧的值,一个称为竞争条件的经典线程问题。