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

Неправильная операция перекрестного потока

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

public void CheckUnusedTabs(string strTabToRemove)
{ 
    TabPage tp = TaskBarRef.tabControl1.TabPages[strTabToRemove];
    tp.Controls.Remove(this);
    TaskBarRef.tabControl1.TabPages.Remove(tp);
} 

Я пытаюсь закрыть вкладку в tabcontrol приложения Windows, используя вышеуказанный код, и я обнаружил ошибку:

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

Как это решить?

4b9b3361

Ответ 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);
            }
        }

Ответ 5

Задайте следующую переменную:

CheckIllegalCrossThreadValidation = false