Задать вопрос
ProKiLL
@ProKiLL
Системный администратор

Как заполнить dataGridView через Parallel.For(){}?

Попытался заполнить dataGridView через Parallel.For(){} но столкнулся со следующей ошибкой:
Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'dataGridView1' не из того потока, в котором он был создан.


Заполняю следующим образом:
dataGridView1.Rows.Clear();
            dataGridView1.Columns.Clear();

            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "dgvRegNum", HeaderText = "Рег. №", Width = 70 });
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "dgvRegDate", HeaderText = "Рег. Дата", Width = 80 });
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "dgvThemes", HeaderText = "Краткое содержание", Width = 400 });
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "dgvListDoc", HeaderText = "Документ", Width = 90 });
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "dgvListAdd", HeaderText = "Приложение", Width = 110 });
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "dgvTypeSend", HeaderText = "Вид отправления", Width = 150 });
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "dgvSendDate", HeaderText = "Дата отправления", Width = 100 });
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "dgvUID", HeaderText = "УИД", Width = 50 });
            Parallel.For(0, LetterList.Count, i =>//for (int i = 0; i < LetterList.Count; i++)
            {
                dataGridView1.Rows.Add(LetterList[i].Регистрационный_номер, LetterList[i].Регистрационная_дата.Substring(0, 10), LetterList[i].Краткое_содержание, LetterList[i].Количество_листов_документа, LetterList[i].Количество_листов_приложения, LetterList[i].Вид_отправления.Наименование, LetterList[i].Дата_отправки.Substring(0, 10), LetterList[i].ИД);
            });


Как выйти из положения?
  • Вопрос задан
  • 263 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
Rou1997
@Rou1997
Никак.
Во-первых, действительно, нельзя делать это с DataGridViewпоскольку он контрол, можно только с DataTable, который затем к нему привяжете.
Во-вторых, в любом случае перемешается порядок строк, а если поставить семафор, то от многопоточности не будет никакого толку поскольку операции будут производиться последовательно и это не даст ускорения за счет многоядерности ЦПУ.
Ответ написан
Комментировать
dmitry_pavlov
@dmitry_pavlov
World-class .NET freelance contractor (remotely)
Чтобы быстро заполнить данными грид, нужно из ваших данных сначала создать объект DataTable и затем скормить его в DataSource грида.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы