Перенаправление на другую форму в приложении Windows c # - PullRequest
0 голосов
/ 25 июня 2009

Я использую функцию ниже, чтобы закрыть существующую форму и открыть новую форму. Я получаю сообщение об ошибке ниже, когда код пытается закрыть существующую форму

Ошибка:

{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 Ответ

2 голосов
/ 25 июня 2009

Я бы предположил, что MyContext.curMain относится к форме, созданной в другом потоке, отличном от того, который вы в данный момент выполняете при попытке закрыть его (вызов StartThread(); и сообщение об исключении указывают, что существует некоторая многопоточность продолжается). Все попытки выполнить какие-либо методы в MyContext.curMain должны выполняться в потоке, в котором он был создан. Это достигается с помощью Invoke или BeginInvoke, например:

MyContext.curMain.Invoke(new Action(MyContext.curMain.Close));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...