Как включить кнопку формы после завершения процесса? - PullRequest
1 голос
/ 05 января 2011

У меня есть приложение для Windows, разработанное с использованием C #.В этом приложении я создаю один процесс. Я хочу включить и отключить несколько кнопок, когда происходит событие Process_Exited (). В методе Process_Exited () я написал код для включения кнопок, но во время выполнения я получаю ошибку как

«Операция между потоками недопустима: элемент управления 'tabPage_buttonStartExtraction' доступен из потока, отличного от потока, в котором он был создан."

Мой фрагмент кода:

 void rinxProcess_Exited(object sender, EventArgs e)
 {
     tabPage_buttonStartExtraction.Enabled = true;
     tabPageExtraction_StopExtractionBtn.Enabled = false;
 }

МожетКто-нибудь подскажет, как сделать это возможным?

Ответы [ 3 ]

3 голосов
/ 05 января 2011

Переместите строки включения / выключения в отдельный метод и вызовите этот метод из rinxProcess_Exited, используя метод Control.Invoke.

2 голосов
/ 05 января 2011

Вы пытаетесь изменить пользовательский интерфейс из другого потока.Попробуйте что-то вроде этого:

    private void SetText(string text)
    {
        // InvokeRequired required compares the thread ID of the
        // calling thread to the thread ID of the creating thread.
        // If these threads are different, it returns true.
        if (this.textBox1.InvokeRequired)
        {   
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            this.textBox1.Text = text;
        }
    }

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

Источник: http://msdn.microsoft.com/en-us/library/ms171728.aspx

2 голосов
/ 05 января 2011

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

Вот решение, примененное к вашему примеру:

void rinxProcess_Exited(object sender, EventArgs e)
{
    if (this.InvokeRequired)
    {
        this.Invoke((Action)(() => ProcessExited()));
        return;
    }

    ProcessExited();
}

private void ProcessExited()
{
    tabPage_buttonStartExtraction.Enabled = true;
    tabPageExtraction_StopExtractionBtn.Enabled = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...