C # цикл параллельно для - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть цикл для создания ImageButton во время выполнения

try
        {                             
                for (int i = 0; i <= NumDia; i++)
                {
                    aImageButton[i] = new ImageButton();
                    aImageButton[i].ID = "ImageButton" + (i + 1);
                    .....
                    TableCell cell = new TableCell();
                    cell.Controls.Add(aImageButton[i]);
                    row.Cells.Add(cell);
                }                                
            TblThumb.Rows.Add(row);
         }

как преобразовать для (int i = 0; i <= NumDia; i ++) в Parallel.For? </p>

я пробовал, aImageButton - это параметр Action?

 Parallel.For(0, NumDia, i =>

        {
           code
        });

1 Ответ

0 голосов
/ 11 ноября 2018

Вы не можете.Проблема в том, что вы можете работать с пользовательским интерфейсом (добавлять кнопки в строку / ячейку) только из потока STA.Но Parallel.For создаст отдельный поток, и вы получите ошибку: System.InvalidOperationException:

'Cross-thread operation not valid: Control 'Form1' accessed from a thread other than the thread it was created on.'

Кроме того, вы можете сделать form.Invoke(() => row.Cells.Add(cell)), чтобы подавить эту ошибку, но вы потеряете всю прибыль от Parallel.For, потому что row.Cells.Add(cell) является самой дорогой частью вашего кода.

Вы можете воспроизвести его с помощью следующего кода:

Parallel.For(0, NumDia, (i, state) =>
    {
        aImageButton[i] = new ImageButton();
        aImageButton[i].ID = "ImageButton" + (i + 1);
        .....
        TableCell cell = new TableCell();
        cell.Controls.Add(aImageButton[i]);
        row.Cells.Add(cell);
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...