В моем постоянном стремлении лучше понять потокобезопасное программирование в .NET, я не могу получить ясность в вопросе, поэтому я надеюсь, что кто-то из SO может быть в состоянии помогать.Безопасность потоков DataGridViewRow в Windows Forms .NET
Я понимаю, что контроль над форматом Windows не должен обрабатываться ничем неинтерфейсом/рабочим потоком напрямую без использования Control.Invoke или Control.BeginInvoke. Однако, что же касается объекта DataGridViewRow? Если я правильно понимаю, сам объект DataGridViewRow НЕ является элементом управления. Тем не менее, это обычное использование, чтобы добавить его в элемент управления DataGridView. Это влияет на то, как нам нужно взаимодействовать с объектом DataGridViewRow?
Например, если у вас есть объект DataGridViewRow, добавленный в элемент управления DataGridView, безопасно ли напрямую обращаться к объекту DataGridViewRow? Или это так, поскольку, поскольку он был добавлен в элемент управления DataGridView, он должен быть доступен только с помощью DataGridView.Invoke.
Обратите внимание, что в этом примере мы не изменяем значение и вместо этого читаем его. Это даже имеет значение?
//since we are passing a DataGridViewRow object and NOT the actual DataGridView Control object, is it safe to call this method directly from a worker thread? Note, in this code example we are NOT modifying the value and instead we are only reading it. If were WERE modifying the value, would it make a difference?
string retrieveColumn1Value (DataGridViewRow row)
{
string column1String = row.Cells[column1].Value.ToString();
return column1String;
}
//or is it the case that since the DataGridViewRow object has been added to our DataGridView Control, that we have to use this method instead to ensure thread-safety?
string retrieveColumn1ValueWithInvoke (DataGridViewRow row)
{
string column1String = (string)dataGridView1.Invoke(new retrieveColumnValuesDelegate(lookupColumnValues), new object[] { row });
return column1String;
}