3

有谁知道我如何从另一个线程更改窗体的窗口状态?这是我正在使用的代码:

    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'从创建它的线程以外的线程访问。” 知道如何让它工作吗?

4

5 回答 5

9

这将适用于 .NET 3.5:

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

或 2.0:

Invoke(new MethodInvoker(delegate { this.WindowState = FormWindowState.Normal; }));
于 2010-04-08T15:31:00.317 回答
1

只需在 StackOverflow“跨线程操作无效”或 Google 中搜索此字符串。请不要那么懒惰。

于 2010-04-08T15:29:56.540 回答
1

请参阅此站点上的 Invoke() 和 BeginInvoke() 之间的区别。“选择”的答案很好地解释了你应该做什么。

长话短说,你希望不同的线程不完全创建一个新进程(或者你不太可能想要那个),你可能想要使用Invoke()而不是BeginInvoke()异步的。

于 2010-04-08T15:31:27.967 回答
1

将这行代码添加到 Click 事件处理程序:

process.SynchronizingObject = this;
于 2010-04-08T15:32:12.123 回答
-2

这将解决您的问题在form_load事件中添加它

 System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
于 2013-09-10T20:48:50.540 回答