支持进程执行过程中途打断

Posted on   云起  阅读(6)  评论(1编辑  收藏  举报
static void Main(string[] args)
{
    Process process = null;
    CancellationTokenSource cancellationTokenSource = null;

    do
    {
        var command = Console.ReadLine();
        if (command == "quit")
            break;
        if (command == "start")
        {
            // 创建CancellationTokenSource实例
            cancellationTokenSource = new CancellationTokenSource();
            var token = cancellationTokenSource.Token;
            Task.Run(() =>
            {
                // 启动一个外部进程
                process = new Process();
                var procStartInfo = process.StartInfo;
                procStartInfo.FileName = "ping.exe";
                procStartInfo.Arguments = "127.0.0.1 -n 10";
                procStartInfo.RedirectStandardOutput = true;
                procStartInfo.RedirectStandardError = true;
                procStartInfo.UseShellExecute = false;
                procStartInfo.CreateNoWindow = false;
                procStartInfo.RedirectStandardInput = true;

                process.Start();

                while (!process.HasExited)
                {
                    Thread.Sleep(2000);
                    if (cancellationTokenSource.IsCancellationRequested)
                    {
                        Console.WriteLine("close");
                        process.Kill();
                        break;
                    }
                }

                process.WaitForExit();
                var result = process.StandardOutput.ReadToEnd();
                Console.WriteLine("over");
                Console.WriteLine(result);
            }, token);
        }
        if (command == "cl")
        {
            if (cancellationTokenSource != null)
            {
                cancellationTokenSource.Cancel();
            }
        }
    } while (true);
}

进程对象本身没有中断的方法,只能进行关闭,为了能通过命令交互及时中断进程并获取执行中产生的输出,采用异步调用的方式,通过CancellationTokenSource进行取消操作。
进程开启后,通过轮询方式,来响应取消操作,进行进程关闭。关闭进程后,再及时获取输出。

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

随笔 - 119, 文章 - 0, 评论 - 3, 阅读 - 3957

Copyright © 2025 云起
Powered by .NET 9.0 on Kubernetes

点击右上角即可分享
微信分享提示