【发布时间】:2012-10-12 07:55:15
【问题描述】:
最近我使用了一个外部 dll 库,对此我没有任何影响。 在某些特殊情况下,这个第三方dll的某个方法是阻塞的,并且永不返回。
我尝试通过在新的 AppDomain 中执行此方法来解决此问题。自定义超时后,我想卸载 AppDomain 并杀死所有这些废话;)
不幸的是,它不起作用 - 正如人们所期望的那样。
一段时间后它会抛出CannotUnloadAppDomainException,因为阻塞方法不允许优雅地中止线程。
我依赖使用这个库,似乎不会很快有更新。
即使这不是最佳做法,我能否解决此问题? 任何不好的黑客表示赞赏:)
【问题讨论】:
-
为什么需要 AppDomain?为什么不确定在单独的线程中运行您需要做的任何事情?如果线程挂起并且你想要一个肮脏的黑客然后使用
thread.Abort() -
这是我早期的方法。但是即使在调用 Abort 之后线程也没有被杀死,所以我推测我在 AppDomains 上有更多的硬杀死可能性
-
@wal Thread.Abort 不起作用,在本机调用中唯一可以使用的是
TerminateThread,而您真的不想调用它。另见How to kill a thread in C# effectively?。您应该考虑将线程保留为僵尸 - 除非它是一个长时间运行的进程或该线程正在消耗 CPU 时间,否则放弃它不会造成太大的伤害。
标签: c# .net com parallel-processing appdomain