0

关闭使用两个线程(主线程和辅助线程)的应用程序时,有时会出现跨线程异常。我认为正在发生的事情是主 UI 线程正在被处置,而辅助线程仍在运行,并且由于辅助线程有时会调用 UI 线程上的内容,因此它正在崩溃。

我需要在FormClosing事件中手动关闭辅助线程吗?

谢谢(你的)信息。

4

3 回答 3

1

我需要手动关闭辅助线程吗?

不,是的。

不,如果您的辅助线程是后台线程。您可以在辅助线程上检查/设置IsBackground属性。当不再有前台线程运行时,CLR 会自动停止所有后台线程。例如,所有 ThreadPool 线程都是后台线程。

是的,但是,当您在辅助线程中执行一些关键任务并且您不希望它突然停止时。在这种情况下,您将不得不实施适当的逻辑来停止您的辅助线程。

于 2013-09-21T18:22:37.213 回答
1

一旦你有一个长时间运行的专用线程,你必须为它实现关闭逻辑。原因很简单:应用程序不会被操作系统杀死,直到至少有一个线程处于活动状态。是的,没有“主线程”这样的东西,从操作系统的角度来看,所有线程都是平等的。

鉴于此,一旦您的应用计划退出,您必须

  1. 向预期终止的第二个线程发出信号
  2. 等待第二个线程,直到它从他的线程进程中退出

现在你可以自由退出了。

于 2013-09-21T18:12:25.670 回答
1

在多线程 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

于 2013-09-21T17:56:43.490 回答