Member 13174280 Ответов: 1

Задача на параллельную задачу.invoke()


при выполнении первого цикла (i = 0)
System.InvalidOperationException: 'Invalid cross-thread operation: the 'boxframe' control was accessed from a different thread than the one from which the creation was performed.'


Что я уже пробовал:

private void CreaThumbs(string path)
{
 .....
            Action[] actions = new Action[3];     
            actions[0] = () => CreaBox(i);
            actions[1] = () => CreaImage(i, path, FileImg);
            actions[2] = () => CreaButton(i);

for (i = 0; i < elementi; i++)
  {
      ...........
      (Parallel.Invoke(actions);
      ..........
  }

private void CreaBox(int i)
        {
            boxCornice[i] = new Label();
	    ....
        }

private void CreaImmage(int i, string path, string NameFile)
        {
            //create PictureBox
            pictBox[i] = new PictureBox();
            pictBox[i].Parent = boxCornice[i];  //controllo associato            
            ........
	}            

private void CreaButton(int i)
        {
            btnRotateSx[i] = new PictureBox();
            btnRotateSx[i].Parent = boxCornice[i];
	    ....
	    btnRotateDx[i] = new PictureBox();
            btnRotateDx[i].Parent = boxCornice[i];
	    ....

        }
...
}

F-ES Sitecore

Google the error message for solutions (вам нужно использовать "Invoke") - это очень часто задаваемый вопрос.

1 Ответов

Рейтинг:
1

OriginalGriff

Вы можете только получить доступ (или создать) Элементы управления пользовательского интерфейса из потока, в котором они были созданы - поток пользовательского интерфейса. Если вы попытаетесь получить к ним доступ из потока, не являющегося пользовательским интерфейсом, вы получите исключение cress threading.

Вы можете вызвать их обратно в поток пользовательского интерфейса, но ... поскольку весь ваш многопоточный код пытается создать элементы управления пользовательского интерфейса, все, что вы сделаете, это добавите дополнительный уровень обработки в свой код и все равно получите те же задачи, которые будут выполняться последовательно в одном потоке.

Скорее всего, вы пытаетесь сделать это для того, чтобы создать много миниатюр одновременно: это не сработает. Полностью сбросьте графические поля и вручную нарисуйте миниатюры изображений на одном элементе управления в его событии рисования. Это должно быть намного быстрее, чем создание элементов управления общего назначения, таких как PictureBoxes.