为什么我要在多线程进程中正确终止所有线程呢?

时间:2015-09-17 18:01:43

标签: c# multithreading visual-studio

我工作的公司使用Visual Studio开发其网站及其所有功能,还有一个单独的网站是为测试网站而开发的。这个“测试”站点可以针对网站运行单独的测试用例,并且必须针对每个可能的案例运行。

所有内容都是用VB.NET编写的,每次运行程序时都会创建一个线程来运行测试。然而,在测试的“结束”,线程似乎仍然存在。必须手动单击Visual Studio中的停止按钮才能终止应用程序。此外,应用程序关闭后很长时间内,任务栏中都会出现一个进程图标。

在我看来,该程序没有正确终止测试期间运行的所有线程,但我不确定这是否值得在办公室中使用,所以我问下面的问题...

正确关闭应用程序及其上运行的所有线程的目的是什么,如果有的话,有什么后果呢?

2 个答案:

答案 0 :(得分:1)

现在它可能是一个小问题,但它不是一个好习惯,恕我直言。想象一下,如果相同的代码现在由持续集成服务器(例如,TeamCity(或Jenkins,或......))执行,并且单元测试由所述构建服务器连续自动运行,会发生什么。

当这些线程无法干净地关闭时,构建状态会发生什么?由于线程中的设计决策不好,或者由于我们的单元测试代码中的简单(可能是愚蠢的)错误,我们经常面临这个问题。但是,净效果是一个挂起的构建过程。

在有人(仁慈地)杀死构建过程之前,我已经看到CI服务器挂了将近半天。从本质上讲,这表明我们的代码中存在一个问题,可能会也可能不会成为一个大问题。如果这是服务器端代码,则此代码可能导致非常糟糕的情况。我的建议是挖掘你的内省工具包(内存分析,性能分析等),看看究竟发生了什么,并解决它。

答案 1 :(得分:0)

我们在应用程序中遇到了类似的问题,该应用程序正在我们的应用程序服务器上索引SPA页面。它在某些情况下抛出异常并且线程没有关闭。最大的缺点是它会消耗掉糟糕的服务器内存 另一个缺点是它作为Web应用程序运行,它将占用可用端口并在可用端口用尽时停止运行。 代码应该被修改为在完成或异常后和平地杀死线程,当然报告任何。