Привет,
Из двух потоков приходит информация и выдаётся на UI. Делаю UI update через BeginInvoke. Для этого имеется два делегата, в одном происходит добавление row.
Иногда получаю странную Exception при добавлении новой row в GataDridView:
SystemInvalidOperationException: No row can be added to a DataGridView control that does not have columns. Columns must be added fist.
Столбцы DatagridView инициализируются статически при создании контрола. Поэтому здесь проблем не должно быть.
Кусок кода где возникает Exception:
row = GetRowWithKey(sKey);
if (row == null)
{
int index = dataGridViewConfServers.Rows.Add();
if (index >= 0)
{
row = dataGridViewConfServers.Rows[index];
row.Tag = obService;
}
else
{
throw new Exception("Can't create new row.");
}
}
row.Cells[0].Value = obService.Parent.ExternLookupName == null ? obService.Name : obService.Parent.ExternLookupName;
row.Cells[1].Value = obService.EndPoint.ToString();
row.Cells[2].Value = obService.State.ToString();
При какой-то констелляции происходит "разрушение" контрола DatagridView.
Такой вопрос:
Если два потока одновременно вызывают BeginInvoke, может такое быть, что UI thread тоже параллельно выполнит оба делегата (обновление UI)? Так как происходит доступ к контролу в двух фунциях, получется "undefined behevior"?
Это мои предположения.
Здравствуйте, Iso12, Вы писали:
I>Из двух потоков приходит информация и выдаётся на UI. Делаю UI update через BeginInvoke.
Покажите BeginInvoke.
I>Столбцы DatagridView инициализируются статически при создании контрола. Поэтому здесь проблем не должно быть.
Покажите код создания и вообще весь код, относящийся к проблеме. То что вы показали, можно было и не показывать.
I>Где копать?
Начните с mcve. Если вам действительно хочется решить проблему — попытайтесь воссоздать проблему. Добавляйте "похожесть" постепенно, сначала просто DataGridView, инициализированный как у вас, потом добавление как у вас.. нет ошибки — добавляйте BeginInvoke.. нет ошибки — смотрите, чтобы еще добавить, чтобы увеличить "похожесть". Если ошибка воспроизвелась, а в чем дело — непонятно, тогда и только тогда можно смело задавать вопрос, на который даже могут ответить.
Здравствуйте, Iso12, Вы писали:
I>Если два потока одновременно вызывают BeginInvoke, может такое быть, что UI thread тоже параллельно выполнит оба делегата (обновление UI)? Так как происходит доступ к контролу в двух фунциях, получется "undefined behevior"?
Нет, ничего "параллельно" не выполняется. BeginInvoke это помещение делегата в очередь, исполнение будет по очереди, синхронно в потоке UI. Скорее всего BeginInvoke здесь не при чем, впрочем сложно судить без кода.
Здравствуйте, Iso12, Вы писали:
I>Иногда получаю странную Exception при добавлении новой row в GataDridView:
Там какие то проблемы в DataGridView с биндингом. Биндинг там сам работает через очередь сообщений, так что можно "удачно" вклиниться в тот момент, когда он сам чего то там обновляет. Я в свое время способ пофиксить так и не нашел.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK>Там какие то проблемы в DataGridView с биндингом. Биндинг там сам работает через очередь сообщений, так что можно "удачно" вклиниться в тот момент, когда он сам чего то там обновляет. Я в свое время способ пофиксить так и не нашел.