【问题标题】:Startup application error using C# process使用 C# 进程启动应用程序错误
【发布时间】:2015-12-13 17:03:48
【问题描述】:

我想使用带有一些内存限制的进程来启动应用程序。我使用 kernel32.dll 中的 AssignProcessToJobObject 方法来做到这一点。我尝试启动消耗 10 MB 内存且内存限制为 1 MB 的应用程序。但启动后,我看到一个带有启动应用程序错误的对话框窗口。我该如何处理?

【问题讨论】:

  • 1MB 内存限制?您希望一个 c# 应用程序消耗少于 1MB 的空间吗?当然你会得到一个错误。
  • 这只是一个示例。我选择了内存限制以确保这将是一个错误。
  • @timbset 和你想做什么来响应错误?
  • @usr 我不认为他理解如果一个进程需要一定数量的内存,你不能少给它并期望它工作。 timbset,您是否故意尝试处理故意抛出的错误?这对我来说毫无意义......
  • 我只想向控制台写一条消息,说明我无法启动应用程序,或者我启动了它,但它在内存限制后被杀死。但我不想看到一个对话框窗口阻塞了我的主应用程序。

标签: c# winapi process kernel32


【解决方案1】:

MSDN 文章 Job Limits and Notifications 描述了如何获得超出限制的通知。

请注意,此通知不会终止进程,您必须自己执行此操作。因为进程是由您的主管程序杀死的,而不是由于资源限制,所以 Windows 不会弹出您试图避免的对话框。

如果您确实使用了导致进程立即终止的“硬”限制,您仍然可以检测到资源限制已被触发。

作业对象记录其所有关联进程的基本记帐信息,包括已终止的进程。要检索此记帐信息,请使用 QueryInformationJobObject 函数。

但是,您将无法避免操作系统提供的限制终止进程的对话框。无论如何,这种会计似乎不适用于内存限制。所以你应该改用通知方案。

看看JOBOBJECT_LIMIT_VIOLATION_INFORMATION 结构。

【讨论】:

  • 我不太明白这与操作员的问题有什么关系。
  • @cFrozenDeath:OP 的子进程由于超出作业对象中设置的资源限制而死亡。我正在解释如何配置该作业对象以在超出限制时生成通知。
  • 我明白这一点,但我不明白这一切的重点。如果您知道该任务将使用 1GB 的 RAM,并且如果您少给它就会崩溃,那么尝试以这种方式运行任务有什么意义呢?毕竟,你已经知道它会崩溃。
  • @cFrozenDeath:测试您计划用于未来未知需求任务的限制设置代码?
  • 这似乎是合理的
猜你喜欢
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多