【发布时间】:2023-03-23 02:18:01
【问题描述】:
我有一个多线程 C#“控制台”应用程序,其中包含许多线程完成。我所有的线程都退出了。 90% 的时间应用程序优雅地退出。但是有 10% 的情况下,我的应用程序的副本仍然存在:控制台仍然打开。
我通过 Visual Studio 2010 附加到它并使用 break 来中断它,并显示两个“空”堆栈帧:一个用于 Main,一个用于我的应用程序创建的线程之一。堆栈上也没有任何东西。如果我单击这些线程中的任何一个,Visual Studio 会说“源代码不可用于该线程”,并且它提供了一个“已解密的代码视图”链接。我点击它,它说“反汇编代码不适用于该线程”。
任何想法我可能做错了什么?
【问题讨论】:
-
在调试器选项中禁用仅我的代码,然后重试。
-
您是否调用 Environment.Exit 来显式终止您的进程?
-
这看起来像是我已经遇到的问题,但就我而言,我什至无法暂停调试! +最喜欢。顺便说一句,您是否正确地分叉并加入所有线程?您可以检查挂起线程的堆栈跟踪到您的托管代码吗?例如,一个线程可能在信号量中被阻塞,该信号量是部分非托管的。
-
我正在编写一个库,所以我无法控制所有用户线程,他们也不知道我的线程。但结果是不,我不能调用 join 来收集线程状态。相反,我(试图)通过从它们的初始方法返回来终止我的所有线程,然后我的理论是,当主线程也终止时,进程地址空间将消失。通常,它确实如此。但有时似乎徘徊。
标签: c# multithreading termination