15

我有这个运行的代码.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

我该如何解决?感谢您的时间和回答。

4

3 回答 3

45

您收到异常是因为您试图从一个线程关闭表单,而不是在它创建的地方。这是不允许的。

像这样做

this.Invoke((MethodInvoker) delegate
        {
            // close the form on the forms thread
            this.Close();
        });
于 2013-08-19T08:53:22.237 回答
1

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

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

看一下

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

于 2013-08-19T08:56:23.383 回答
-1

您可以使用关闭表单Delegate

      public delegate void CloseDelagate(); 

      Form1.Invoke(new CloseDelegate(Form2.Close));
于 2013-08-19T08:52:11.210 回答