c# STAThreads未被清理- OutOfMemory异常
本文关键字:OutOfMemory 异常 STAThreads | 更新日期: 2023-09-27 18:16:33
我有一个控制台应用程序,它将一个文件夹作为输入,选取该文件夹中的所有文件并处理它们。处理是顺序的,对于每个文档,它启动一个单独的STAThread,该STAThread在其中运行一个依赖于WPF的操作。
应用程序在获得OutOfMemoryException并因为Dispatcher为空而抛出错误之前管理处理了~1k个文档。
使用ProcessExplorer查看,我可以看到:
- 没有任何运行/挂起的。net线程
- 有49k句柄分配当它崩溃
- 这4k是线程句柄
问题:
- 什么可能导致线程句柄不被释放(我可以看到它们正在ProcExplorer中被创建和删除,但它似乎跟不上它们被创建的速度)。
- 我怎么能看到那49k把手是什么?ProcessExplorer只显示大约5k项—其余的是什么?
- 如何解决OutOfMemory异常?我的理解是,整个进程会死亡,因为它最终会分配太多内存并导致碎片。我尝试通过AppDomains +强制调用GC分离线程,但没有任何改变。
已经有一段时间了,但我想抓住答案,以防有人也遇到这个问题。
问题是由WPF双关引起的。
因为我们呼叫Dispatcher的方式。invokesshutdown,有时它会导致在同一线程中对同一对象进行多次调用,尽管不会导致任何异常,但每次后续对WPF的调用将不再处理句柄,并将导致内存泄漏