c# STAThreads未被清理- OutOfMemory异常

本文关键字:OutOfMemory 异常 STAThreads | 更新日期: 2023-09-27 18:16:33

我有一个控制台应用程序,它将一个文件夹作为输入,选取该文件夹中的所有文件并处理它们。处理是顺序的,对于每个文档,它启动一个单独的STAThread,该STAThread在其中运行一个依赖于WPF的操作。

应用程序在获得OutOfMemoryException并因为Dispatcher为空而抛出错误之前管理处理了~1k个文档。

使用ProcessExplorer查看,我可以看到:

  • 没有任何运行/挂起的。net线程
  • 有49k句柄分配当它崩溃
  • 这4k是线程句柄

问题:

    什么可能导致线程句柄不被释放(我可以看到它们正在ProcExplorer中被创建和删除,但它似乎跟不上它们被创建的速度)。
  1. 我怎么能看到那49k把手是什么?ProcessExplorer只显示大约5k项—其余的是什么?
  2. 如何解决OutOfMemory异常?我的理解是,整个进程会死亡,因为它最终会分配太多内存并导致碎片。我尝试通过AppDomains +强制调用GC分离线程,但没有任何改变。

c# STAThreads未被清理- OutOfMemory异常

已经有一段时间了,但我想抓住答案,以防有人也遇到这个问题。

问题是由WPF双关引起的。

因为我们呼叫Dispatcher的方式。invokesshutdown,有时它会导致在同一线程中对同一对象进行多次调用,尽管不会导致任何异常,但每次后续对WPF的调用将不再处理句柄,并将导致内存泄漏