ZetCode

C# 进程

最后修改于 2023 年 7 月 5 日

在本文中,我们将探讨如何使用 System.Diagnostics 命名空间在 C# 中处理进程。

Process 类提供对本地和远程进程的访问,允许开发人员启动、停止、监视和与系统进程交互。无论是启动外部应用程序、捕获进程输出还是管理正在运行的任务,Process 类都提供了一套全面的功能。

为了配置进程执行,C# 提供了 ProcessStartInfo 类,该类指定了各种设置,例如

Process 类是 System.Diagnostics 命名空间的一部分,该命名空间包含用于调试、监视和性能分析的各种工具。

凭借启动、管理和终止系统进程的能力,C# 开发人员可以有效地与外部应用程序交互、自动化任务并分析系统活动。

C# 进程简单示例

在第一个示例中,我们启动一个控制台命令,该命令显示文件的内容。

Program.cs
using System.Diagnostics;

Process.Start("cat", @"C:\Users\Jano\Documents\words.txt");

该示例使用 cat 命令输出 words.txt 文件的内容。默认情况下,该命令不是 Windows 操作系统的一部分;它随 git 工具一起安装(请参阅 gitforwindows.org)。

Process.Start("cat", @"C:\Users\Jano\Documents\words.txt");

进程使用 Start 方法启动。

$ dotnet run
sky
cloud
falcon
owl
crane

C# 进程运行程序

在以下示例中,我们运行一个 GUI 程序。

Program.cs
using System.Diagnostics;

using var process = new Process();

process.StartInfo.FileName = "notepad.exe";
process.Start();

在该示例中,我们运行记事本程序。它是一个标准的、小型文本编辑器。

process.StartInfo.FileName = "notepad.exe";

StartInfo.FileName 属性设置或获取要启动的应用程序或文档。

Program.cs
using System.Diagnostics;

using var process = new Process();

process.StartInfo.FileName = "notepad.exe";
process.StartInfo.Arguments = @"C:\Users\Jano\Documents\words.txt";
process.Start();

我们使用 StartInfo.Arguments 来传递要打开的文件名。

C# 启动和终止程序

下一个示例启动一个程序并在几秒钟后终止它。

Program.cs
using System.Diagnostics;

using var process = Process.Start("notepad.exe");

Thread.Sleep(3000);
process.Kill();

该示例启动记事本,睡眠三秒钟,然后使用 Kill 方法终止该进程。

C# Process.GetProcessesByName

Process.GetProcessesByName 创建一个新的 Process 组件数组,并将它们与共享指定进程名称的现有进程资源相关联。

Program.cs
using System.Diagnostics;

Process[] processes = Process.GetProcessesByName("Firefox");
Console.WriteLine("{0} Firefox processes", processes.Length);

Array.ForEach(processes, (process) =>
{
    Console.WriteLine("Process: {0} Id: {1}",
        process.ProcessName, process.Id);
});

在该示例中,我们找到属于 Firefox 的所有进程。 我们列出它们的 Id 和进程名称。

Process[] processes = Process.GetProcessesByName("Firefox");

我们通过名称“Firefox”获取进程数组。

Console.WriteLine("{0} Firefox processes", processes.Length);

我们打印找到的进程数量。

Array.ForEach(processes, (process) =>
{
    Console.WriteLine("Process: {0} Id: {1}", 
        process.ProcessName, process.Id);
});

我们使用 ForEach 方法列出进程。

$ dotnet run
12 Firefox processes
Process: firefox Id: 10056
Process: firefox Id: 13016
Process: firefox Id: 12944
Process: firefox Id: 10124
Process: firefox Id: 15556
...

C# Process.GetProcesses

Process.GetProcesses 创建一个新的 Process 组件数组,并将它们与现有进程资源相关联。

Program.cs
using System.Diagnostics;

Process[] processes = Process.GetProcesses();

Array.ForEach(processes, (process) =>
{
    Console.WriteLine("Process: {0} Id: {1}",
        process.ProcessName, process.Id);
});

该示例列出所有进程。

Process[] processes = Process.GetProcesses();

我们获取进程数组。

Array.ForEach(processes, (process) =>
{
    Console.WriteLine("Process: {0} Id: {1}", 
        process.ProcessName, process.Id);
});

我们迭代该数组并打印进程名称和 Id。

C# 进程重定向输出

StandardOutput 属性获取用于读取应用程序的文本输出的流。

Program.cs
using System.Diagnostics;

var psi = new ProcessStartInfo();
psi.FileName = "ls";
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;

using var process = Process.Start(psi);
using StreamReader reader = process.StandardOutput;

string data = reader.ReadToEnd();

File.WriteAllText("output.txt", data);

在该示例中,我们将 ls 命令的输出重定向到 output.txt 文件。

psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;

UseShellExecute 设置为 false 使我们能够重定向输入、输出和错误流。(在此上下文中,shell 指的是图形 shell,而不是命令 shell,例如 bash 或 sh。)

using var process = Process.Start(psi);

我们使用提供的信息启动进程。

using StreamReader reader = process.StandardOutput;

我们获取标准输出的 StreamReader

string data = reader.ReadToEnd();

我们使用 ReadToEnd 方法读取所有数据。

File.WriteAllText("output.txt", data);

最后,我们将数据写入文件。

来源

Process 类 - 语言参考

在本文中,我们使用了 C# 中的进程。

作者

我的名字是 Jan Bodnar,我是一位热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程