正确处理每次在不同行中抛出的内存不足异常

本文关键字:内存不足 异常 正确处理 | 更新日期: 2023-09-27 18:34:51

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

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

AppDomain.CurrentDomain.UnhandledException/Application.ThreadException是没有选择的(为时已晚(。

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

正确处理每次在不同行中抛出的内存不足异常

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

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