关闭使用两个线程(主线程和辅助线程)的应用程序时,有时会出现跨线程异常。我认为正在发生的事情是主 UI 线程正在被处置,而辅助线程仍在运行,并且由于辅助线程有时会调用 UI 线程上的内容,因此它正在崩溃。
我需要在FormClosing
事件中手动关闭辅助线程吗?
谢谢(你的)信息。
关闭使用两个线程(主线程和辅助线程)的应用程序时,有时会出现跨线程异常。我认为正在发生的事情是主 UI 线程正在被处置,而辅助线程仍在运行,并且由于辅助线程有时会调用 UI 线程上的内容,因此它正在崩溃。
我需要在FormClosing
事件中手动关闭辅助线程吗?
谢谢(你的)信息。
我需要手动关闭辅助线程吗?
不,是的。
不,如果您的辅助线程是后台线程。您可以在辅助线程上检查/设置IsBackground属性。当不再有前台线程运行时,CLR 会自动停止所有后台线程。例如,所有 ThreadPool 线程都是后台线程。
是的,但是,当您在辅助线程中执行一些关键任务并且您不希望它突然停止时。在这种情况下,您将不得不实施适当的逻辑来停止您的辅助线程。
一旦你有一个长时间运行的专用线程,你必须为它实现关闭逻辑。原因很简单:应用程序不会被操作系统杀死,直到至少有一个线程处于活动状态。是的,没有“主线程”这样的东西,从操作系统的角度来看,所有线程都是平等的。
鉴于此,一旦您的应用计划退出,您必须
现在你可以自由退出了。
在多线程 Windows 应用程序中推荐的方法是使用Method Invocation
而不是直接操作在另一个线程上创建的控件。这样你永远不会得到Cross Thread Exception
. 例如,您可以像这样设置文本框的文本:
form1.BeginInvoke(new MethodInvoker(()=>textbox1.text = "Hello!"));
有关详细信息,请参阅:http: //msdn.microsoft.com/en-us/library/ms171728 (v=vs.85).aspx