Как изменить состояние окна формы в другом потоке? - PullRequest
2 голосов
/ 08 апреля 2010

Кто-нибудь знает, как я могу изменить состояние окна формы из другого потока? Это код, который я использую:

    private void button4_Click(object sender, EventArgs e)
    {
            string pathe = label1.Text;
            string name = Path.GetFileName(pathe);
            pathe = pathe.Replace(name, "");
            string runpath = label2.Text;
            Process process;
            process = new Process();

            process.EnableRaisingEvents = true;
            process.Exited += new System.EventHandler(process_Exited);

            process.StartInfo.FileName = @runpath;
            process.StartInfo.WorkingDirectory = @pathe;
            process.Start();
            WindowState = FormWindowState.Minimized;
    }
    private void process_Exited(object sender, EventArgs e)
    {
        this.WindowState = FormWindowState.Normal;
    }

Он предназначен для запуска программы и ее минимизации, а затем после закрытия программы возвращается в нормальное состояние. Хотя я получаю эту ошибку: «Недопустимая операция между потоками: доступ к элементу управления Form1 осуществляется из потока, отличного от потока, в котором он создан» Есть идеи, как заставить это работать?

Ответы [ 5 ]

7 голосов
/ 08 апреля 2010

Это будет работать в .NET 3.5:

Invoke(new Action(() => { this.WindowState = FormWindowState.Normal; }));

или 2,0:

Invoke(new MethodInvoker(delegate { this.WindowState = FormWindowState.Normal; }));
1 голос
/ 08 апреля 2010

Добавьте эту строку кода в обработчик событий Click:

process.SynchronizingObject = this;
1 голос
/ 08 апреля 2010

См. В чем разница между Invoke () и BeginInvoke () на этом сайте. «Выбранный» ответ дает хорошее объяснение того, что вы должны делать.

Короче говоря, вы хотите, чтобы разные НИТИ не создавали новый процесс полностью (или крайне маловероятно, что вы этого хотите), и вы, вероятно, хотите использовать Invoke(), а не BeginInvoke(), который является асинхронным.

1 голос
/ 08 апреля 2010

Просто найдите эту строку в StackOverflow «Операция с несколькими потоками недопустима» или в Google. Пожалуйста, не будь таким ленивым.

0 голосов
/ 11 сентября 2013

это решит вашу проблему, добавьте его в form_load событие

 System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
...