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

This will work in .NET 3.5:

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

Or 2.0:

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

次のコード行を Click イベント ハンドラーに追加します。

process.SynchronizingObject = this;
于 2010-04-08T15:32:12.123 に答える
1

この文字列を StackOverflow "Cross-thread operation not valid" または Google で検索してください。そんなに怠け者にならないでください。

于 2010-04-08T15:29:56.540 に答える
1

See What’s the difference between Invoke() and BeginInvoke() on this site. The "chosen" answer gives a good explanation of what you're supposed to do.

Long story short, you want different THREADS not making a new process entirely (or highly unlikely you want that), and you probably want to use Invoke() and not BeginInvoke() which is asynchronous.

于 2010-04-08T15:31:27.967 に答える
-2

form_loadこれはあなたの問題を解決し、イベントに追加します

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