C# 意外的跨线程问题

C# 意外的跨线程问题,c#,multithreading,process,C#,Multithreading,Process,原则上,我试图做一些非常简单的事情,但我一直遇到一个跨线程异常,这让我很为难,因为我不打算使用多线程 我有一个Windows窗体应用程序。它启动另一个Windows窗体应用程序(使用System.Diagnostics.Process类),并在该应用程序关闭时捕获退出的事件。然后,我的应用程序事件处理程序尝试将文本从剪贴板复制到当前显示表单上的控件。此时会引发交叉线程异常 我假设问题是来自关闭应用程序的事件在另一个线程中(我在这里超出了我的舒适区,请耐心等待),因此问题归结为“如何防止此异常?”

原则上,我试图做一些非常简单的事情,但我一直遇到一个
跨线程异常
,这让我很为难,因为我不打算使用多线程

我有一个Windows窗体应用程序。它启动另一个Windows窗体应用程序(使用
System.Diagnostics.Process
类),并在该应用程序关闭时捕获退出的事件。然后,我的应用程序事件处理程序尝试将文本从剪贴板复制到当前显示表单上的控件。此时会引发
交叉线程异常

我假设问题是来自关闭应用程序的事件在另一个线程中(我在这里超出了我的舒适区,请耐心等待),因此问题归结为“如何防止此异常?”


我有点被迫从剪贴板复制,但如果这样可以解决问题的话,我可以以不同的方式启动另一个应用程序

退出的
事件不会在UI线程中触发,它会在
进程创建的某个后台线程中触发,以监视其他进程

您需要封送到UI线程以访问控件,这可以通过使用
控件来完成。Invoke
方法:

textbox1.Invoke(new Action(()=> textbox1.Text = Process.ExitCode.ToString()));

代码怎么样;o) @DHN这是一个非常简单的问题,有一个非常简单的解决方案,不会因具体情况而有所不同;我看不出需要额外的代码。我正在访问调用应用程序中的控件。这就是你的意思吗?我分配给控件的文本来自剪贴板,而不是退出的应用程序本身。我不明白我为什么要越界。@傲慢地说,指定的文本是不相关的;为了这个例子,我选择了一些东西。正如我在回答中所说的,跨线程异常是因为事件是由进程类在另一个线程中触发的。您没有显式地创建新线程这一事实并不妨碍
进程
类在内部这样做。对于事件处理程序,附加事件的线程是不相关的,它在类本身选择的任何线程中触发事件,而它没有选择使用UI线程。好的,我理解。是否有其他方法可以在不创建其他线程的情况下启动从属应用程序?在我的主要应用程序中,遗留代码存在封装问题,这使得您的解决方案在我的情况下很难实现(实际的表单控件封装在接口后面的其他对象中,等等)。@xantam
Invoke
将在内部执行检查,因此我不知道为什么这种构造如此常见。它不必要地添加额外的代码,没有额外的好处。