Неверная операция перекрестных потоков
Возможный дубликат:
Неверная операция кросс-потоков: управление осуществляется из потока, отличного от потока, который был создан в
Хорошо, я знаю, почему это дает мне эту ошибку:
Работа с кросс-потоками недействительна: Элемент управления 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 заканчивается, поэтому мне не очень-то интересно, что-то необычное или сложное, если это не облегчит работу с пользовательским интерфейсом в новой теме.
Ответы
Ответ 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
}
}