【发布时间】:2014-03-05 00:15:11
【问题描述】:
我现在正处于 DLL 地狱中,试图让我的代码在不同应用程序的框架内工作。在很长一段时间里,我一直在苦苦思索,试图理解为什么我的方法显然被排入 ThreadPool 时没有被调用。
最终证明,一个特定的 DLL 必须与调用方法位于同一文件夹中,或者找不到它,ThreadPool 线程要么死掉,要么默默地放弃工作(就像忍者一样)。
显然,该解决方案编译得非常完美,并且没有任何错误,因为正在构建有问题的 DLL,只是到另一个文件夹。这不是第一次 ThreadPool 线程因为放错位置的 DLL 而在我身上默默地死掉了。
- 我的线程消失后到底发生了什么?
- 我如何确定将来会发生这种情况?有没有机会在某个地方有一个日志文件?
一些代码:
protected void Enqueue()
{
try
{
Task.Run(() => Process());
}
catch (Exception ex)
{
// Logging code here (no issues)
}
}
protected void Process()
{
// A breakpoint here will never be called
try {
// Code that calls into offensive DLL
}
catch (Exception e)
{
// Logging code
}
}
【问题讨论】:
-
您是否尝试过在工作线程入口函数周围放置 try/catch,并记录错误以查看可能正在杀死您的线程的未处理异常?
-
订阅 Application.ThreadException .... stackoverflow.com/questions/8836766/… ---- stackoverflow.com/questions/5714520/…
-
@LB2 不应该取消这个过程吗?
-
线程应该很少只是“消失”。他们可以,但这通常意味着整个应用程序都会消失。 +1 订阅 ThreadException 事件。此外,将线程条目的主体包装在 try/catch 中并输出发生的任何异常。一旦你这样做了,你可以发回你得到的任何异常,有人可以给你更具体的建议。
-
Application.ThreadException 是个坏建议,它只会触发 UI 线程上引发的异常,并且本身会产生大量噪音。损坏的日志记录是这里明显的故障模式。
标签: c# threadpool