从另一个线程关闭表单

时间:2013-08-19 08:49:44

标签: c# multithreading winforms exe

我有这个运行.exe

的代码
string openEXE = @"C:\Users\marek\Documents\Visual Studio 2012\Projects\tours\tours\bin\Debug\netpokl.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 个答案:

答案 0 :(得分:33)

您正在获取异常,因为您试图从除了创建内容之外的其他线程关闭该表单。这是不允许的。

这样做

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

答案 1 :(得分:1)

当控件的创建线程以外的线程尝试访问该控件的某个方法或属性时,通常会导致不可预测的结果。常见的无效线程活动是在错误的线程上调用访问控件的Handle属性

获取或设置一个值,该值指示在调试应用程序时是否捕获访问控件的Handle属性的错误线程上的调用。

看看

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

答案 2 :(得分:-1)

您可以使用Delegate

关闭表单
      public delegate void CloseDelagate(); 

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