读取但不更新DataGridView控件时.net中的GUI跨线程安全性
本文关键字:GUI 中的 线程 安全性 net 更新 DataGridView 控件 读取 | 更新日期: 2023-09-27 18:07:40
关于使用control从工作线程更新GUI控件的SO有大量的问题/答案。调用时,我无法清楚地了解从控件读取数据而不更新控件的主题。
示例:我在Windows窗体上有一个DataGridView。从工作线程,我想检查DGV上特定单元格的值,但我不需要/想要更新值。从一个工作线程,我调用一个方法,作为它的唯一参数一个DataGridView对象,然后该方法检查一个特定的单元格在DataGridView,但不修改它,我需要使用。invoke在这种情况下?
现在代码看起来运行良好,没有明显的警告,没有使用。invoke。然而,我不清楚这是否安全,因为它不更新DGV,而是只看DGV的细胞,而不修改它们中的任何一个。
有人能解释一下吗?我很抱歉,如果这是一个重复的问题,但我找不到任何其他问题,专注于只是阅读控件而不更新/修改它在多线程的情况下。
谢谢。
从工作线程调用的示例方法:
private DataGridViewRow getRowObject(DataGridView dgv)
{
foreach (DataGridViewRow row in dgv.Rows)
{
if ((int)dgv[specialColumn, row.Index].Value == 100)
return row;
}
}
没有InvalidOperationException不能证明线程安全。Winforms只对非常特定的成员访问执行检查。它必须涉及在底层操作系统调用中使用的Handle属性。这将永远不会发生在你的代码中,DataGridView不会从Windows调用中获取数据。
一个明显的不线程安全的情况是允许用户继续编辑网格值。当然,您将得到一个与线程执行完全不同步的不可预测的值。你需要设置DataGridView。ReadOnly属性设置为true以防止这种情况发生。
那么DataGridViewCell如何获得它的值就很重要了。不明显的情况是它引发cellvaluenneeded事件或网格绑定时。现在完全取决于代码是否线程安全。
不安全。
控件,特别是dataGrid,将在底层使用Collection类。当其他线程可能进行编辑时,读取它们是不安全的。
读取某些属性(如SelecteItem)将需要一个Handle并触发跨线程警告异常