1

我的 c# 应用程序可以OOM不时抛出(它允许用户不使用 SQLlimit命令检索数据),我只需要正确处理它。MessageBox包含使用建议就limit足够了。

问题是OOM每次都在不同的行中引发(在同一行检索相同的数据,但是新数据 - 新的异常点):有时 GDI+ 没有可用内存来进行绘制,有时 SQL 连接器失败,有时其中一个包装类。不同的行,不同的类,不同的事件处理程序,甚至不同的匿名方法。它并不像听起来那么糟糕,类层次结构是相当合法的,但我真的不能让它简单到只使用一个(甚至两个)try/catch块(应用程序是多线程的顺便说一句)。

AppDomain.CurrentDomain.UnhandledException/Application.ThreadException是没有选择的(为时已晚无法处理)。

有没有办法正确处理OOM应用程序抛出的第一个(“第一个”,因为捕获OOM数据检索入口点会导致另一个OOM,例如由于尝试清除SortableBindingList)?以这样一种方式处理它,当您试图强制 GC 做一些工作时,不会在其他地方分配内存?

4

1 回答 1

1

您似乎在假设 OOM 是因为垃圾收集器没有完成它的工作。更有可能是因为您的应用程序使用了太多内存(或内存碎片过多)。

如果您的应用程序的内存使用情况由用户输入决定,并且如果您无法限制该用户输入以防止 OOM,那么我建议在单独的 AppDomain 中执行失败的代码。如果该 AppDomain 失败,那么您的原始 AppDomain 仍将处于良好状态以处理失败并通知用户“不要再这样做”。

于 2013-10-13T03:02:10.790 回答