我的c#app可以不时地抛出OOM
(它允许用户使用SQL limit
命令检索数据),我只需要正确处理它。 MessageBox
包含使用limit
的建议就足够了。
问题是每次都会在不同的行中引发OOM
(检索相同数据的同一行,但是新数据 - 新的异常点):有时GDI +没有空闲内存来进行绘制,有时候SQL连接器失败,有时是其中一个包装类。不同的行,不同的类,不同的事件处理程序,甚至不同的匿名方法。这并不像听起来那么糟糕,类层次结构非常合法和东西,但我真的不能简单地只使用一个(甚至两个)try/catch
块(app是多线程的btw)。
AppDomain.CurrentDomain.UnhandledException
/ Application.ThreadException
是没有选择的(处理起来太晚了)。
有没有办法正确处理应用程序抛出的第一个OOM
(“第一个”因为在数据检索入口点附近捕获OOM
导致另一个{{1} },例如由于试图清除OOM
)?为了处理它,当你试图强制GC做一些工作时,不会在其他地方分配内存?
答案 0 :(得分:1)
你好像假设OOM是因为垃圾收集器没有完成它的工作。更有可能的是,这是因为您的应用程序使用了太多内存(或者内存碎片过多)。
如果您的应用程序的内存使用量由用户输入决定,并且您无法限制该用户输入以防止OOM,那么我建议在单独的AppDomain中执行失败的代码。如果该AppDomain失败,那么您的原始AppDomain仍然处于良好状态以处理失败并通知用户“不要再这样做”。