【发布时间】:2011-06-26 23:25:20
【问题描述】:
我看到了一些与此问题类似的讨论,但没有任何内容能真正回答我所面临的问题。
我正在开发一个可以通过解释脚本自定义软件行为的 C# 应用程序。每个脚本都在 C# 应用程序的不同子线程上运行。 (我正在使用 Jint javascript 解释器来运行脚本,但我的问题对于线程可以在 .NET 应用程序中动态运行的任何其他情况同样有效)。到目前为止,这工作得很好。但我需要确保应用程序能够自行运行。如果出现可能导致应用程序耗尽堆空间的错误脚本,我需要能够检测并停止任何占用过多内存的线程。从概念上讲,这可以看作类似于 Web 浏览器确定页面上的 javascript 是否需要太长时间或太多内存来执行。问题是,我无法确定 .NET 中是否有任何方法可以做到这一点。
有什么方法可以对线程可以使用的内存量进行硬性限制,或者从父线程快速检查线程的内存利用率?我不关心线程内的堆栈溢出,只关心堆空间。
“显而易见”的解决方案当然是将解释拆分为单独的进程而不是单独的线程,但这会对我的应用程序产生重大的性能影响,因为这些脚本会修改软件行为,因此旨在紧密耦合.应用程序级别的监控也不理想,因为它不会提供有关哪个脚本本身没有运行的信息。此外,用于调试的慢速方法将不起作用,因为脚本旨在允许快速修改软件,而不必构建、测试和重新部署。我只需要一些相当快速的方法来检测占用过多内存的线程,这样我就可以杀死并忽略它的脚本。
谢谢!
【问题讨论】:
-
“我正在开发一个 C# 应用程序,可以通过解释脚本自定义软件行为。每个脚本都在 C# 应用程序的不同子线程上运行”-?如果您所做的只是自定义应用程序。为什么脚本需要在不同的线程上运行?
-
“因为这些脚本修改了软件行为,因此旨在紧密耦合” - 我听到紧密耦合脚本这个词,我开始怀疑设计......
-
如果你想限制内存使用,那么我认为你最好使用单独的进程。如果某些脚本存在危险,您绝对无法控制不玩游戏,那么我会确保它无论如何都在单独的进程上运行。我不确定您是否可以限制每个线程所需的方式,因为如果有任何 API 可用,它将是一个 Windows API,据我所知,您无法为其映射托管线程和 Windows 线程有任何用处。
-
脚本改变了软件的行为,所以进程间通信会花费他。虽然在单独的进程中运行这样的脚本是更好的想法/解决方案。
标签: c# multithreading memory