Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非UI线程,UI访问_C#_Winforms_Multithreading - Fatal编程技术网

C# 非UI线程,UI访问

C# 非UI线程,UI访问,c#,winforms,multithreading,C#,Winforms,Multithreading,众所周知,您不能从UI线程以外的任何其他线程更新UI 然而,我刚刚发现了一些代码,它毫无例外地从非UI线程获取listview virtualsize的值 所以我的问题是: 您可以从非UI线程与UI进行什么交互 多谢各位 Theo因为它可以在不引发异常的情况下工作,但这并不意味着您应该这样做。 问题在于,除了更新UI的方法的Invoke要求之外,这些控件还不支持多线程。这意味着,当用户界面线程在您检索数据时更新数据时,确实会得到损坏的数据。具体规则是,您不能调用使用窗口句柄的Windows AP

众所周知,您不能从UI线程以外的任何其他线程更新UI

然而,我刚刚发现了一些代码,它毫无例外地从非UI线程获取listview virtualsize的值

所以我的问题是: 您可以从非UI线程与UI进行什么交互

多谢各位
Theo

因为它可以在不引发异常的情况下工作,但这并不意味着您应该这样做。


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

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

但是,有时属性值是可用的,不需要API调用。Text属性就是一个很好的例子。它是缓存的,因为它经常被使用。读取文本属性不会生成异常,只会得到缓存的值。但是编写文本属性会出错,更新屏幕上的文本需要API调用。VirtualSize的工作方式与此完全相同


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

如果我错了,请纠正我,但从另一个线程读取值不会更新任何内容,因此这是可能的。如果您需要更改UI中的某些内容,则需要使用UI调度程序(如果可用)将您的操作与UI线程同步。无论您是否正在更新。重要的是,UI线程可能正在更新您试图读取的数据,然后您会得到损坏的数据。因此,本质上,您可以侥幸逃脱,但是,不要!编写你的代码,这样你就不必逃脱惩罚。仅使用该线程收集数据,应在UI线程上使用该线程更新UI。当你使用BackgroundWorker时,这很自然。不。特别是因为文档明确指出这些对象不支持多线程(请参阅类的“线程安全”一章),所以它们不会试图锁定这些对象!