C#STAThreads没有被清理 - OutOfMemory异常

时间:2016-11-05 20:24:49

标签: c# wpf multithreading garbage-collection sta

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

应用程序设法在获取OutOfMemoryException之前处理~1k文档并抛出错误,因为Dispatcher为null。

使用ProcessExplorer查看我可以看到:

  • 没有任何正在运行/挂起的.NET线程
  • 崩溃时分配~49k句柄
  • 这些4k中的
  • 是线程句柄

问题:

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

1 个答案:

答案 0 :(得分:-1)

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

该问题是由WPF的两次关闭引起的。

由于我们调用Dispatcher.InvokeShutdown的方式,有时会导致在同一线程中对同一线程进行多次调用,即使这不会导致任何异常,以后每次对WPF的调用都将不再释放该句柄,并且将导致内存泄漏