2009-06-25 7 views
0

CのWindowsアプリケーション内の別のフォームにリダイレクトします。は、私は、既存のフォームを閉じするには、以下の機能を使用して、新しいフォームを開封しております。#

{のSystem.InvalidOperationException:有効ではありませんクロススレッド操作:コントロール「スクリーンセーバー」スレッド以外のスレッドからアクセスコードは、既存のフォーム

エラーを閉じようとするとき は、私は以下のエラーを取得していますそれはで作成されました。

コード:

public static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     StartThread(); 
     Application.Run(new MyContext(new Screensaver())); 
    } 
    public class MyContext : ApplicationContext 
    { 
     static private Form curMain = null; 

     public MyContext(Form main) 
     { 
      MyContext.NewMainForm(main, false); 
     } 

     static public void NewMainForm(Form main, bool ClosePreviousMain) 
     { 
      try 
      { 
       if (main != null) 
       { 
        if (ClosePreviousMain & MyContext.curMain != null) 
        { 
         MyContext.curMain.FormClosed -= new FormClosedEventHandler(main_FormClosed); 
         MyContext.curMain.Close(); 
        } 

        MyContext.curMain = main; 
        MyContext.curMain.FormClosed += new FormClosedEventHandler(main_FormClosed); 
        MyContext.curMain.Show(); 
       } 
      } 
      catch (Exception ex) 
      { 
       ExceptionHandler.writeToLogFile(System.Environment.NewLine + "Message : " + ex.Message.ToString() + System.Environment.NewLine + "Stack : " + ex.StackTrace.ToString()); 
      } 
     } 

     static private void main_FormClosed(object sender, FormClosedEventArgs e) 
     { 
      Application.Exit(); 
     } 

    } 

答えて

2

私はMyContext.curMainはあなたが現在それをクローズしようとしたときに実行されている1(コールStartThread();と例外メッセージよりも、別のスレッドで作成されたフォームを参照していることを推測します何らかのスレッドが進行中であることを示します)。 MyContext.curMainのいずれかの方法を実行するためのすべての試みは、それが作成されたスレッド上で実行する必要があります。これは、次のような、InvokeまたはBeginInvokeを使用することによって達成される:

MyContext.curMain.Invoke(new Action(MyContext.curMain.Close)); 
+0

こんにちはフレドリックモルク、 今魔法のように動作し、フォームを閉じる を。 しかし、既存のフォームを閉じた後にフォームを表示する際の問題。 WATSが起こって、私はそれではなく、フォームを開く新しいプロセスを開き、任意のexception.Insteadを取得しておりません、です。 プロセス名は新しいフォーム名と同じです。 おかげで、 – Anuya

+0

こんにちはフレドリックモルク、今働いて その。私は使用されました。 MyContext.currform.ShowDialog()。 ありがとう – Anuya

関連する問題