Закрыть форму из другого потока

у меня есть этот код, который работает .exe

string openEXE = @"C:UsersmarekDocumentsVisual Studio 2012ProjectstourstoursbinDebugnetpokl.exe";
                 Process b = Process.Start(openEXE);
                 b.EnableRaisingEvents = true;
                 b.Exited += (netpokl_Closed);

и когда он закрывается, он вызывает метод netpokl_Closed. Проблема в том, когда я insert into netpokl_Closed command -this.Close() это исключение поднимается: Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on

как я могу это исправить ? Спасибо за ваше время и ответы.

3 ответов


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

, это

this.Invoke((MethodInvoker) delegate
        {
            // close the form on the forms thread
            this.Close();
        });

когда поток, отличный от потока создания элемента управления, пытается получить доступ к одному из методов или свойств этого элемента управления, это часто приводит к непредсказуемым результатам. Общим недопустимым действием потока является вызов неправильного потока, который обращается к свойству дескриптора элемента управления

получает или задает значение, указывающее, следует ли перехватывать вызовы неправильного потока, который обращается к свойству дескриптора элемента управления при отладке приложения.

посмотреть at

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.checkforillegalcrossthreadcalls.aspx


Вы можете закрыть форму с помощью Delegate

      public delegate void CloseDelagate(); 

      Form1.Invoke(new CloseDelegate(Form2.Close));