Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OutOfMemoryException陷阱/事件(在try catch旁边)_C#_.net_Exception_Out Of Memory - Fatal编程技术网

C# OutOfMemoryException陷阱/事件(在try catch旁边)

C# OutOfMemoryException陷阱/事件(在try catch旁边),c#,.net,exception,out-of-memory,C#,.net,Exception,Out Of Memory,我刚开始做一个现有的大项目。其中一些包含遗留代码。 我被要求编写一个组件,该组件将在同一进程中运行,该进程应在发生致命错误或情况时发出警报并重新启动服务器 例如,当抛出OutOfMemoryException时,我应该通知客户端,然后重新启动服务器。问题是,搜索所有现有的Try-catch块,然后编辑并向其catch块中添加新代码,既困难又耗时。更重要的是,新的程序员可以添加一个新的try-catch块,并忘记在捕获OutOfMemoryException时发出警报 您是否知道如何监视/侦听Ou

我刚开始做一个现有的大项目。其中一些包含遗留代码。 我被要求编写一个组件,该组件将在同一进程中运行,该进程应在发生致命错误或情况时发出警报并重新启动服务器

例如,当抛出OutOfMemoryException时,我应该通知客户端,然后重新启动服务器。问题是,搜索所有现有的Try-catch块,然后编辑并向其catch块中添加新代码,既困难又耗时。更重要的是,新的程序员可以添加一个新的try-catch块,并忘记在捕获OutOfMemoryException时发出警报

您是否知道如何监视/侦听OutOfMemoryException和类似的异常,而不需要查找和编辑,也不需要添加到每个现有和将来的Try-catch块中

我正在使用.NET4

编辑:

OutOfMemoryException只是一个例子。 可能有遗留代码捕获OfMemoryException,将消息打印到日志,然后什么也不做。
这正是您应该修复OutOfMemoryException的原因。。不想抓住它。它可以从任何地方扔出去。。随时都可以


此外。。这是一个内存不足的异常。。您如何保证进程有足够的内存来处理它?你没有。有一件事值得一试,那就是使用应用程序域方法。您可以创建新的应用程序,在应用程序中创建一个新的应用程序域来执行遗留代码。您的代码有一个try…catch块,例如

try {
    // Execute legacy code app domain.
} catch (OutOfMemoryException ex) {
    // Do whatever you need.
}
以下是一些帮助您解决问题的文章:

由于OOM异常将发生在旧应用程序域的应用程序域中,因此它不应影响新代码的应用程序域,即由于Windows内存管理、虚拟内存。

[Comment Wrapper]

你应该仔细考虑一下,然后再重新思考一下你在做什么

OutOfMemoryException并不总是意味着程序内存不足,甚至许多windows intern lib使用此ex来指示其他问题,例如Image.Load。。。函数可以抛出该函数。。。但这不仅意味着没有足够的可用内存。。。还有更多的可能性。。。但你仍然应该考虑什么样的事后处理是继电器使用< /P>
一种方法是使用From WPF,它允许您使用。AppDomain.CurrentDomain.UnhandledException和this.Dispatcher.UnhandledException事件,允许您处理程序层上的事件。如果你附加了一个处理程序,你可以考虑哪个窗口应该由Windows崩溃来处理,而在EvEthANDLE中,通过设置E.处理< /P>,你应该查看这个帖子,而不是重新思考你正在做的可能的重复记忆,异常是在栈中传播的。您不必在每个函数中都有try/catch块,当然也不必处理像这样的全局异常。如果绝对必须这样做,请将try/catch放在Main函数中。我不推荐。这种类型的异常表示您的应用程序处于非常脆弱的状态,可能无法恢复,也不可能可靠地执行catch块中的任何代码。OutOfMemoryException并不总是意味着程序内存不足,甚至许多windows intern lib使用此ex表示其他问题,例如图像。加载。。。函数可以抛出该函数。。。但这不仅意味着没有足够的可用内存。。。还有更多的可能性。。。但你仍然应该考虑什么样的前处理是中继使用的一种方式可能是使用从WPF允许您使用。AppDomain.CurrentDomain.UnhandledException和this.Dispatcher.UnhandledException事件,允许您处理程序层上的事件。如果你附加了一个处理程序,你可以考虑哪一个请求应该被Windows崩溃来处理,并且通过E.EnthDANDER在E-HANDANDLE中通过ED处理来处理它,不知道这是否是一个解决方案。句柄进程可能是一个Ext1类语句。例如我知道它无论如何都会终止服务器,但是在终止过程之前尝试做一些动作是很好的。因此,考虑抛出OutOfMeMyExyExtExchange时的情况。您如何建议框架为您分配更多内存来做任何事情?内存不足。。在终止过程之前,它在哪里分配调用函数/执行某些操作所需的内容?你是对的。在这种情况下,做任何处理都可能有问题。可能只需要终止该程序。谢谢,我将进一步研究这种方法。一个问题是遗留代码可能试图捕获OutOfMemoryException。如果我理解正确,你是说在新的应用程序中,我可以创建一个新的应用程序域并监视它的OOM异常?谢谢!它会成功的!抱歉耽搁了,我已经离开一天了。理论上
您的应用程序域应该能够捕获从旧应用程序域引发的异常。这非常适合您,因为您希望专门处理OOM异常。不过我需要对应用程序域进行更多研究,以检查它是否会影响应用程序的性能。例如,更少的内存将被视为对性能的影响。同意。你必须总是尝试/研究任何新的做事方式。扔掉对你不起作用的东西,至少你学会了一种不能达到你需要的方法。