C# 查找导致CannotUnloadAppDomainException的有问题线程

C# 查找导致CannotUnloadAppDomainException的有问题线程,c#,.net,appdomain,C#,.net,Appdomain,在我的C#.Net 4.0项目中,我使用AppDomains加载插件程序集,要求它们执行工作,然后卸载AppDomain,这样我就不必将程序集保留在主进程中 对于一个特定的插件,当我调用AppDomain.Unload()时,我会得到一个CannotUnloadAppDomainException。我发现这很可能是因为插件启动了一个后台线程,该线程要么被卡住,要么在catch或finally块中花费了很长时间(~10秒)。不幸的是,我不知道线程在哪里 这只发生在客户的机器上,因此我无法使用我的调

在我的C#.Net 4.0项目中,我使用AppDomains加载插件程序集,要求它们执行工作,然后卸载AppDomain,这样我就不必将程序集保留在主进程中

对于一个特定的插件,当我调用
AppDomain.Unload()
时,我会得到一个
CannotUnloadAppDomainException
。我发现这很可能是因为插件启动了一个后台线程,该线程要么被卡住,要么在
catch
finally
块中花费了很长时间(~10秒)。不幸的是,我不知道线程在哪里

这只发生在客户的机器上,因此我无法使用我的调试器提供帮助。不过,我可以给他们一个补丁,让他们在日志文件中写入更多信息,如果我能找到更有用的东西来写出来的话

我有插件程序集的源代码,我一直在尝试做一些静态分析和运行一些测试,但它相当大,我没有找到一个地方,它被困在
陷阱中
最后

我的问题是:

  • 是否有任何方法可以在获取
    CannotUnloadAppDomainException
    时获取子AppDomain中使用调用堆栈运行的线程列表

  • 除了
    catch
    finally
    块之外,还有其他代码段可以引发此异常吗


  • 当程序发生时,让客户机运行以获取程序的ETW跟踪,它应该可以让您获得有关在异常发生的确切时刻运行的内容的更详细信息。下面是演示如何使用它的示例。

    使用(a)中提到的Microsoft.Diagnostics.Runtime库,我可以列出子AppDomain函数即将返回时仍在运行的所有线程及其调用堆栈。我确实需要临时将我的应用程序升级到.NET 4.5才能与库一起运行,但库的源代码是,因此可以使用<.NET 4.5构建此库


    事实证明,这是处理我们数据库连接的第三方库中的一个bug,当数据库在本地计算机上使用SSL时,留下了几个被锁定的线程。

    我们在运行windows服务的win 2012服务器上遇到了类似的问题-奇怪的是,在win 10上运行了相同的代码(甚至作为服务)
    无法卸载AppDomainException
    未出现。我们在应用程序域中留下了一个非后台线程;清理线程解决了我们的问题