Неправильная операция перекрестного потока
Возможный дубликат:
Неверная операция кросс-потоков: управление осуществляется из потока, отличного от потока, который был создан в
public void CheckUnusedTabs(string strTabToRemove)
{
TabPage tp = TaskBarRef.tabControl1.TabPages[strTabToRemove];
tp.Controls.Remove(this);
TaskBarRef.tabControl1.TabPages.Remove(tp);
}
Я пытаюсь закрыть вкладку в tabcontrol приложения Windows, используя вышеуказанный код, и я обнаружил ошибку:
Неверная операция перекрестных ссылок.
Как это решить?
Ответы
Ответ 1
Вы можете вносить изменения только в элементы управления WinForm из основного потока. Вам нужно проверить, является ли InvokeRequired истинным в элементе управления, а затем вызывать метод по мере необходимости.
Вы можете сделать что-то подобное, чтобы заставить его работать:
public void CheckUnusedTabs(string strTabToRemove)
{
if (TaskBarRef.tabControl1.InvokeRequired)
{
TaskBarRef.tabControl1.Invoke(new Action<string>(CheckUnusedTabs), strTabToRemove);
return;
}
TabPage tp = TaskBarRef.tabControl1.TabPages[strTabToRemove];
tp.Controls.Remove(this);
TaskBarRef.tabControl1.TabPages.Remove(tp);
}
Ответ 2
вызов с помощью invoke, потому что вы обращаетесь к потоку GUI с помощью другого потока
this.Invoke((MethodInvoker)delegate() {CheckUnusedTabs(""); });
Ответ 3
При использовании потоков и элементов управления пользовательского интерфейса в winforms вам нужно использовать InvokeRequired, чтобы внести изменения в элементы управления.
ИЗМЕНИТЬ.
добавил пример.
Форма с кнопкой и меткой.
попробовать
private void button2_Click(object sender, EventArgs e)
{
Thread thread = new Thread(UpdateProcess);
thread.Start();
}
private void SetLabelText(string val)
{
label1.Text = val;
}
delegate void m_SetLabel(string val);
private void UpdateProcess()
{
int i = 0;
while (true)
{
if (label1.InvokeRequired)
{
m_SetLabel setLabel = SetLabelText;
Invoke(setLabel, i.ToString());
}
else
label1.Text = i.ToString();
i++;
Thread.Sleep(500);
}
}
Ответ 4
Неверное исключение в перекрестном потоке связано с доступом к элементам управления пользовательского интерфейса из других потоков, чем основной поток.
http://helpprogramming.blogspot.com/2011/10/invalid-cross-thread-operation.html
Ответ 5
Задайте следующую переменную:
CheckIllegalCrossThreadValidation = false