正确处理每次抛出不同行的OutOfMemoryException

时间:2013-10-10 02:12:47

标签: c# garbage-collection out-of-memory

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

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

AppDomain.CurrentDomain.UnhandledException / Application.ThreadException是没有选择的(处理起来太晚了)。

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

1 个答案:

答案 0 :(得分:1)

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

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