在Windows应用程序中重定向到另一个表单c#

时间:2009-06-25 09:09:49

标签: c#-3.0

我使用以下功能关闭现有表单并打开新表单。 当代码尝试关闭现有表单时,我收到以下错误

错误:

{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();
        }

    }

1 个答案:

答案 0 :(得分:2)

我猜想MyContext.curMain是指在另一个线程上创建的表单,而不是您在尝试关闭它时正在执行的线程(调用StartThread();,并且异常消息指示有一些线程正在进行中)。所有在MyContext.curMain中执行任何方法的尝试都必须在创建它的线程上执行。这是通过使用InvokeBeginInvoke来实现的:

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