【问题标题】:Async Call to shell in C# is open a new thread? [duplicate]在 C# 中对 shell 的异步调用是打开一个新线程吗? [复制]
【发布时间】:2017-09-11 15:25:49
【问题描述】:

我有以下来自答案的代码:Process.start: how to get the output?

static void runCommand() {
    //* Create your Process
    Process process = new Process();
    process.StartInfo.FileName = "cmd.exe";
    process.StartInfo.Arguments = "/c DIR";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    //* Set your output and error (asynchronous) handlers
    process.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
    process.ErrorDataReceived += new DataReceivedEventHandler(OutputHandler);
    //* Start process and handlers
    process.Start();
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();
    process.WaitForExit();
}
static void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine) {
    //* Do your stuff with the output (write to console/log/StringBuilder)
    Console.WriteLine(outLine.Data);
}

在我的情况下,我需要同时调用多个实例,我正在考虑制作线程,但我知道这段代码不需要线程。有人可以解释一下区别吗?如果有必要让线程进行异步调用?
提前致谢。亲切的问候

【问题讨论】:

  • I understand that there is no need of threads with this code 那么,既然你明白了,为什么还要问这个问题呢?
  • 因为我不明白其中的区别。感谢您的帮助。
  • 如果你不明白其中的区别,那你为什么说你明白其中的区别呢?
  • 感谢您的帮助。
  • Process 类本质上是异步的,因为您启动的进程完全独立于您自己的进程。如果您重定向输出,它不再是完全独立的,但是异步处理 I/O 是有据可查的,包括 TextReader。唯一剩下的是进程退出通知,您可以通过检测输出流的结束(即StandardOutput.ReadLineAsync()StandardError.ReadLineAsync() 都返回null)来实现,或者用TaskCompletionSource 包装Exited (见标记的重复)。

标签: c# multithreading shell console delegates


【解决方案1】:

如果你想并行运行你的进程,你必须稍微改变你的代码。行“process.WaitForExit();”不是你想要的(根据你的描述)

参见 MSDN:

WaitForExit() 使当前线程等待,直到相关进程终止。应该在进程上调用所有其他方法之后调用它。为避免阻塞当前线程,请使用 Exited 事件。

因此,如果您想在循环中执行多个 this 实例,请不要在等待时阻塞您的主线程(这会创建额外的 cmd 进程)。

【讨论】:

    【解决方案2】:

    如果您需要运行多个调用,则必须使用另一种策略,因为 WaitForExit() 会阻塞。

    如果您不需要知道何时完成,只需删除 WaitForExit(),因为您不需要同步上下文。

    如果您需要知道进程何时完成,那么线程是一种选择,但是,为许多进程生成线程和进程效率低下 - 您可以利用 Process Exit Event 和一些内务管理来跟踪完成情况,并发出您的自己的事件来表明结论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 2012-11-01
      相关资源
      最近更新 更多