2011-07-01 9 views
3

からフォームを表示する方法(私のフォームの名前はMainFormをです):私はC#ののWinFormsアプリに別々のスレッドでこのコードを実行している別のスレッド

DisplayDownload form2 = new DisplayDownload(); 

form2.TopMost = true; 
form2.Show(); 

しかし、スレッドが起動されると、フォームは決して開きません。私のアプリケーションのメインスレッドにコードを移動すると、それは正常に開きますが、自分のスレッドとして起動すると、フォームは決して開きません。

私はこの記事から受け入れ答え使用してみました:Calling a windows form from another thread (.Net)をしかし、私はこのエラーを取得:

は「System.Delegate」と入力し、匿名メソッドを変換できません、それはデリゲート型でないため

ここでは、私が利用しようとしているコード:

MainForm.Invoke(delegate { 
     DisplayDownload form2 = new DisplayDownload(); 


     form2.TopMost = true; 
     form2.Show(); 
}); 

誰かが私が間違っているのを教えてくださいすることができ、それが動作するように取得する方法?

+0

おそらく 'BeginInvoke()'を呼び出す必要があります。これは、メソッドの実行が完了するのを待たずに終了します。 – SLaks

答えて

1

ので、new MethodInvoker(delegate()追加:

MainForm.Invoke(new MethodInvoker(delegate() 
{ 
      DisplayDownload form2 = new DisplayDownload(); 


      form2.TopMost = true; 
      form2.Show(); 
})); 
+1

それは役に立たないでしょう。 – SLaks

+0

これは私のコードに貼り付けたときに同じエラーが発生します: "代理人の種類ではないため、匿名メソッドを 'System.Delegate'に変換することはできません" – fraXis

+0

です。新しい更新された/改訂されたコードを使用しようとしています:非静的なフィールド、メソッド、またはプロパティ 'System.Windows.Forms.Control.Invoke(System.Delegate)'のオブジェクト参照が必要です –

1

あなたは明示的にデリゲート型のインスタンスを作成する必要があります。

MainForm.Invoke(new Action(delegate { ... })); 

C#2以降は暗黙のうち代表者に、だけ特定のデリゲート型にメソッドグループを変換することができます。
Invokeメソッドは、ベースのDelegateクラスを使用するため、コンパイラが作成する特定のデリゲート型はありません。
したがって、明示的に代理人を作成する必要があります。

+0

これを私のコードに追加すると、このエラーが発生します。非静的フィールド、メソッド、またはプロパティ 'System.Windows.Forms.Control.Invoke(System.Delegate)'にオブジェクト参照が必要です。私はそのコード行を追加し、 "..."の代わりに私のコードを入れました。あれは正しいですか? – fraXis

+0

@fra: 'MainForm'クラスの既存のインスタンスを取得する必要があります。 – SLaks

0

どのスレッド新しいフォームのイベントを処理しますか?メインスレッドにイベントを処理させたい場合は、既存の例のようにControl.Invokeを使用してください。

新しいスレッドで独自のUIイベントを管理する場合は、Application.Runを呼び出す必要があります。これを行うと、フォームはペイントできるようになり、画面に表示されます。

+0

しないでください。複数のUIスレッドは悪い考えです。 – SLaks

+0

@SLaks:適切な状況があり、これがどれかを判断するのに十分な情報が与えられていないので、私は両方のオプションを提示します。 –

関連する問題