C# 3.0 在windows应用程序c中重定向到其他窗体#

C# 3.0 在windows应用程序c中重定向到其他窗体#,c#-3.0,C# 3.0,我正在使用以下功能关闭现有表单并打开新表单。 当代码试图关闭现有表单时,我遇到以下错误 错误: {System.InvalidOperationException:跨线程操作无效:从创建控件“Screensaver”的线程以外的线程访问控件“Screensaver” 代码: public static class Program { /// <summary> /// The main entry point for the application. /

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

错误:

{System.InvalidOperationException:跨线程操作无效:从创建控件“Screensaver”的线程以外的线程访问控件“Screensaver”

代码:

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

    }
公共静态类程序
{
/// 
///应用程序的主要入口点。
/// 
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
StartThread();
运行(新的MyContext(新的屏幕保护程序());
}
公共类MyContext:ApplicationContext
{
静态私有形式curMain=null;
公共MyContext(主窗体)
{
MyContext.NewMainForm(main,false);
}
静态公共void newmain表单(表单main、bool ClosePreviousMain)
{
尝试
{
如果(主!=null)
{
if(ClosePreviousMain&MyContext.curMain!=null)
{
MyContext.curMain.FormClosed-=新的FormClosedEventHandler(main\u FormClosed);
MyContext.curMain.Close();
}
MyContext.curMain=main;
MyContext.curMain.FormClosed+=新的FormClosedEventHandler(main\u FormClosed);
MyContext.curMain.Show();
}
}
捕获(例外情况除外)
{
ExceptionHandler.writeToLogFile(System.Environment.NewLine+“消息:”+ex.Message.ToString()+System.Environment.NewLine+“堆栈:”+ex.StackTrace.ToString());
}
}
静态私有void main_FormClosed(对象发送方,FormClosedEventArgs e)
{
Application.Exit();
}
}

我猜
MyContext.curMain
指的是在另一个线程上创建的表单,而不是在试图关闭它时正在执行的线程上创建的表单(调用
StartThread();
和异常消息指示正在进行线程处理)。所有执行MyContext.curMain中任何方法的尝试都必须在创建该方法的线程上执行。这可以通过使用或来实现,例如:

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

嗨,Fredrik Mörk,现在关闭表单很有魅力。但是在关闭现有表单后显示表单的问题是,我没有得到任何例外。相反,它打开了一个新流程,而不是打开表单。流程名称与新表单名称相同。谢谢,嗨,Fredrik Mörk,它现在工作了。我使用了.MyContext.currform.ShowDialog();谢谢