2009-06-25 82 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

相关问题