1

重複の可能性:
WinForms.Form 所有者を設定するときのクロススレッド例外 - 正しい方法は?

私は C# Windows フォーム アプリケーション開発の初心者です。

私のアプリケーションのメイン フォームでは、以下のような他のスレッドで新しいフォームを作成します。

Task.Factory.StartNew(
            () =>
            {
                PlotForm plotForm = new PlotForm();
                Application.Run(plotForm);
            });

そのフォームを常にメインフォームの上に表示したい。Forms には最上位のプロパティがあります。true に設定すると、他のフォームの上にも表示されます。

インターネットでは、解決策は所有者プロパティを設定することであると言われています。このプロパティを設定すると、フォームが異なるスレッドで作成されるため、クロススレッド操作が行われます。

Task.Factory.StartNew(
            () =>
            {
                PlotForm plotForm = new PlotForm();
                plotForm.Owner = this;
                Application.Run(plotForm);
            }); 

クロススレッド操作が無効です: コントロール 'Form1' は、それが作成されたスレッド以外のスレッドからアクセスされました。

解決策を知っていますか?

ありがとう。

4

1 に答える 1

1

クロス スレッド操作の場合は、 を使用する必要がありますInvoke。「invoke」呼び出しは、「私のスレッドではなく、あなたのスレッドでこのコードを実行してください」という形式を伝えます。

Task.Factory.StartNew(
            () =>
            {
                PlotForm plotForm = new PlotForm ();
                this.Invoke((MethodInvoker)delegate()
                {                   
                   plotForm.Owner = a;
                   plotForm.Show();
                });
            }); 
于 2012-10-14T09:06:35.560 に答える