【问题标题】:Is there any alternative other than Process to execute built-in shell commands in C#除了 Process 之外,还有其他方法可以在 C# 中执行内置的 shell 命令吗
【发布时间】:2012-05-23 21:13:34
【问题描述】:

在 C# 中执行内置 shell 命令除了 Process 之外,还有其他选择吗?目前我正在使用 Process 类来运行这些命令。但在当前场景中,我想并行运行 200 多个这样的命令。所以产生超过 200 个进程并不是一个好主意。还有其他选择吗?

【问题讨论】:

  • 为什么你认为这不是一个好主意?
  • 顺便说一句,为什么需要并行运行 200 个命令?您确实意识到在许多情况下,多线程处理它们可能会比顺序执行慢。
  • 如果您必须使用“dos 命令”,那么您需要一个单独的进程,Process 类是管理它的最佳方式。但是,我相信您可以以更优雅的方式实现您的最终目标。如果不知道您想要实现什么,我无法确定。
  • 你想执行哪个内置的shell命令?也许有一个 .NET 替代品...
  • 对我来说听起来好像你必须使用错误的工具来完成你想做的任何事情。如果你能提供更多关于你想要达到的目标的信息,也许我们可以提供一些替代建议?

标签: c# command-line process


【解决方案1】:

“运行一个dos命令”相当于“创建一个进程并运行它”,所以即使有其他api,仍然会有200个进程(顺便说一句,这没什么好担心的,除非你'在一个非常,非常很小的系统上)

【讨论】:

  • 无论如何,您可能希望将生成的进程数减少到一个合理的数字。您可能需要总共运行 200 个命令,但可能不会同时运行所有命令。一次少于 10 个批次就足够了。
  • 我们正在运行一个实用程序,它将向服务器发送一些请求。为了加载服务器,我们需要并行运行这些实用程序。当我们在一台机器上启动 200 多个进程时,它的内存利用率就会很高。而且我们无权更改实用程序中的代码以发送更多请求。所以我们正在寻找替代方案。但似乎除了更改实用程序本身的代码之外别无他法。
  • @user1283104 你需要知道这个实用程序实际上是做什么的,然后你可以编写c#代码来做。
  • @Jodrell:这就是重点。我们既不应该更改我们正在调用的实用程序中的代码,也不应该使用另一个实用程序来模拟代码的工作。我们必须使用它,这就是我寻找替代品的原因。但似乎我没有太多选择。我将与我的团队重新协商开发另一个具有更好选择的实用程序。谢谢你们的帮助。
【解决方案2】:

你可以,但不应该这样做

using Microsoft.VisualBasic;

Interaction.Shell(...);

注意:您必须添加对 VisualBasic 程序集的引用。

这是对您问题的直接回答,但不是您应该做的事情。

【讨论】:

  • 你能详细说明为什么“不应该做”
  • @user1283104 因为在内部它与 Process.Start 执行相同的操作,但将所有控制和反馈封装在调用者之外。最好写一个函数来做启动,直接使用Process类。您不需要导入 VisualBasic 汇编,并且可以更好地控制使用。
【解决方案3】:

正如 Max Keller 所指出的,System.Diagnostics.Process 总是启动一个新的系统进程。

如果必须启动进程/操作超过几秒钟,我宁愿将所有命令保存在临时文件中并使用System.Diagnostics.Process 执行此操作,而不是单个操作。

// Get a temp file
string tempFilepath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "MyBatchFile.bat");
// Ensure the file dont exists yet
if (System.IO.File.Exists(tempFilepath)) {
    System.IO.File.Delete(tempFilepath);
}
// Create some operations
string[] batchOperations = new string[]{
    "START netstat -a",
    "START systeminfo"
};
// Write the temp file
System.IO.File.WriteAllLines(tempFilepath, batchOperations);

// Create process
Process myProcess = new Process();
try {
    // Full filepath to the temp file
    myProcess.StartInfo.FileName = tempFilepath;
    // Execute it
    myProcess.Start();
    // This code assumes the process you are starting will terminate itself!
} catch (Exception ex) {
    // Output any error to the console
    Console.WriteLine(ex.Message);
}

// Remove the temp file
System.IO.File.Delete(tempFilepath);

【讨论】:

  • 那是那些异步批处理文件之一吗?
  • @user1283104 使用START 窗口将为每个操作生成一个新进程。我已经编辑了我的示例。
  • @GodLesZ: 谢谢你的帮助.. 现在试试.. :)
猜你喜欢
  • 2012-01-29
  • 2020-10-19
  • 2018-03-01
  • 1970-01-01
  • 2015-12-08
  • 2019-09-14
  • 2017-07-18
  • 1970-01-01
  • 2016-05-01
相关资源
最近更新 更多