Подтвердить что ты не робот

Неверная операция перекрестных потоков

Возможный дубликат:
Неверная операция кросс-потоков: управление осуществляется из потока, отличного от потока, который был создан в

Хорошо, я знаю, почему это дает мне эту ошибку:

Работа с кросс-потоками недействительна: Элемент управления Form1 доступен из потока кроме потока, который был создан на.

Но... Как я могу сделать это работоспособным?

System.Threading.Thread t = new System.Threading.Thread(()=>
{
   // do really hard work and then...
   listView1.Items.Add(lots of items);
   lots more UI work
});
t.Start();

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

4b9b3361

Ответ 1

Вы не можете. Операции пользовательского интерфейса должны выполняться на принадлежащей теме. Период.

Что вы можете сделать, это создать все эти элементы в дочернем потоке, а затем вызвать Control.Invoke и выполнить привязку к ним.

Или используйте BackgroundWorker

    BackgroundWorker bw = new BackgroundWorker();
    bw.DoWork += (s, e) => { /* create items */ };
    bw.RunWorkerCompleted += (s, e) => { /* databind UI element*/ };

    bw.RunWorkerAsync();

Ответ 2

Когда вы получаете доступ к свойству from из другого потока, это исключение вызывается. Чтобы обойти эту проблему, существует как минимум 2 варианта.

  • Сообщайте Control не бросать эти исключения (что не рекомендуется):

    Control.CheckForIllegalCrossThreadCalls = false;

  • Использование потокобезопасных функций:

    private void ThreadSafeFunction(int intVal, bool boolVal)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(
                new MethodInvoker(
                delegate() { ThreadSafeFunction(intVal, boolVal); }));
        }
        else
        {
            //use intval and boolval
        }
    }