【问题标题】:C# process lingers after all threads have terminatedC# 进程在所有线程终止后仍然存在
【发布时间】:2023-03-23 02:18:01
【问题描述】:

我有一个多线程 C#“控制台”应用程序,其中包含许多线程完成。我所有的线程都退出了。 90% 的时间应用程序优雅地退出。但是有 10% 的情况下,我的应用程序的副本仍然存在:控制台仍然打开。

我通过 Visual Studio 2010 附加到它并使用 break 来中断它,并显示两个“空”堆栈帧:一个用于 Main,一个用于我的应用程序创建的线程之一。堆栈上也没有任何东西。如果我单击这些线程中的任何一个,Visual Studio 会说“源代码不可用于该线程”,并且它提供了一个“已解密的代码视图”链接。我点击它,它说“反汇编代码不适用于该线程”。

任何想法我可能做错了什么?

【问题讨论】:

  • 在调试器选项中禁用仅我的代码,然后重试。
  • 您是否调用 Environment.Exit 来显式终止您的进程?
  • 这看起来像是我已经遇到的问题,但就我而言,我什至无法暂停调试! +最喜欢。顺便说一句,您是否正确地分叉并加入所有线程?您可以检查挂起线程的堆栈跟踪到您的托管代码吗?例如,一个线程可能在信号量中被阻塞,该信号量是部分非托管的。
  • 我正在编写一个库,所以我无法控制所有用户线程,他们也不知道我的线程。但结果是不,我不能调用 join 来收集线程状态。相反,我(试图)通过从它们的初始方法返回来终止我的所有线程,然后我的理论是,当主线程也终止时,进程地址空间将消失。通常,它确实如此。但有时似乎徘徊。

标签: c# multithreading termination


【解决方案1】:

您的代码是否会在额外的几分钟后关闭。可能是某些 .net 帮助程序 thead 或垃圾收集线程仍在运行。这可能需要一些额外的时间。

您是在运行调试版本还是发布版本,并且您确定该进程不是出于设计目的而持续运行的 Visual Studio 托管进程之一。

【讨论】:

  • 好问题。我会检查一下;可以解释我的问题。
  • Barfieldmv,我认为你说得对。我的大多数线程都在捕获将它们关闭的异常,但有一个正在抛出未捕获的“IsisShutdown”异常。线程堆栈已展开,我猜 Windows 不确定如何处理异常,并使用两个“空”线程将事物置于这种奇怪的状态。它没有报告异常,但似乎当我抓住它时,问题并没有发生。基本上,由于竞争条件,它有 10% 的时间发生。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多