2009-06-25 81 views
0

我正在使用下面的函數關閉現有窗體並打開新窗體。 當代碼試圖關閉現有的形式,我提示以下錯誤:重定向到Windows應用程序c中的另一個窗體#

錯誤:

{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指的是在另一個線程比一個你正在試圖將其關閉(呼叫StartThread();當上執行和異常信息創建的窗體表示正在進行一些線程)。所有嘗試執行MyContext.curMain中的任何方法的嘗試都必須在其創建的線程上執行。這是通過使用InvokeBeginInvoke,這樣實現的:

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

嗨弗雷德裏克·莫克, 關閉形式的作品般的魅力吧。 但在關閉現有表單後顯示錶單時出現問題。 Wats發生的是,我沒有得到任何異常。相反,它打開一個新的過程,而不是打開表單。 進程名稱與新表格名稱相同。 謝謝, – Anuya 2009-06-25 09:22:50

相關問題