关闭应用程序时的交叉线程异常

时间:2013-09-21 17:53:45

标签: c# multithreading

关闭使用两个线程(主线程和辅助线程)的应用程序时,有时会遇到跨线程异常。我认为正在发生的事情是主要的UI线程正在处理,而次要的线程仍在运行,并且由于次要的线程有时会调用UI线程上的东西而崩溃。

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

感谢您的信息。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

一旦有了长时间运行的专用线程,就必须为它实现关闭逻辑。原因很简单:在至少有一个线程存活之前,应用程序不会被操作系统杀死。是的,没有“主线程”这样的东西,从操作系统的角度看,所有线程都是相同的。

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

  1. 向预期终止的第二个线程发出信号
  2. 等待第二个线程,直到它退出线程proc
  3. 现在你可以自由退出了。

答案 2 :(得分:1)

  

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

不,是的。

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

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