【发布时间】:2014-07-30 09:05:59
【问题描述】:
虽然有大量关于使用 Control.Invoke 从工作线程更新 GUI 控件的问题/答案,但我无法弄清楚从控件读取数据而不更新它的主题。
示例:我在 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;
}
}
【问题讨论】:
-
一般来说,当您的后台工作人员需要来自 UI 的信息来完成其工作时,您应该在启动工作人员之前从 UI 获取信息,然后传递一份给工人的信息。只有在工作人员启动后确实需要更改信息时,您才应该从工作人员内的 UI 中提取。
-
谢谢。了解这不一定是好的编码实践,这个问题旨在更深入地了解什么是安全的,什么是不安全的,而不是什么是聪明的或不聪明的编码实践。 :)
标签: c# multithreading winforms datagridview invokerequired