首页 > 系统相关 >支持进程执行过程中途打断

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

时间:2024-04-01 18:33:05浏览次数:12  
标签:Console procStartInfo process var cancellationTokenSource 中途 打断 进程

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进行取消操作。
进程开启后,通过轮询方式,来响应取消操作,进行进程关闭。关闭进程后,再及时获取输出。

标签:Console,procStartInfo,process,var,cancellationTokenSource,中途,打断,进程
From: https://www.cnblogs.com/GISyunqi/p/18109137

相关文章

  • 使用jstack查看当前进程全部线程的状态
     1.使用jps命令找到进程的PID$jps225648Jps5268127284Launcher226980Launcher227624ConcurrencyTest2.使用jstack命令dump出线程信息jstack227624>./thread.dump 3.分析线程的状态信息$grepjava.lang.Thread.Statethread.dump|awk'{print$2$3$4$5}'|uniq......
  • 浏览器的进程
    原文链接:https://blog.csdn.net/jiaoyangdetian/article/details/130184943浏览器是多进程的。打开一个网页,至少4个进程。网络进程浏览器进程:界面显示、用户交互(导航栏的前进、后退);子进程管理(各个页面的管理,创建、销毁);提供存储和处理浏览器底层不可见的操作(网络请求、文件管理......
  • 终止进程
    终止进程背景服务器上有一些野进程,处于睡眠状态,尝试了以下几种方法都不行ps-ef|grepusername|grep-vgrep|cut-c9-15|xargskill-9kill-9$(ps-ef|grepusername)kill-9$(ps-ef|grepsleep)ps-ef|grepusernamekill-9pid解决办法一个个......
  • Linux之进程间通信
    1.进程间通信的目的数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。进程控制:有些进程希望完全控制另一个进程的执行(......
  • vscode远程连接docker容器打断点调试python项目
    vscode远程连接服务器docker容器前提:本地和远程都安装docker插件。1.安装完docker插件后点击插件图标2.如果登录的账号没有docker权限的会会报权限不足,使用以下命令把用户加到docker权限组中sudogpasswd-a<当前登陆用户名>docker#从用户组中删除:sudogpasswd-d<当前......
  • C# NamePipe 进程间通信
    应答式进程间通信全体应答式是指服务端开启管道连接并等待连接,客户端写入请求,服务端读取请求,处理后写入应答,客户端读取应答。最后关闭管道。通信数据为XML形式,写入管道前将对象XML序列化,读取时XML反序列化得到对象。使用XML的原因为.net版本较低,不使用第三方库则不支持JSON,不......
  • 操作系统概念-进程管理-同步互斥camproj
    操作系统概述操作系统定义:能有效的组织和管理系统中的各种软/硬件资源,合理的组织计算机系统工作流程,控制程序的执行,并且向用户提供一个良好的工作环境和友好的接口。操作系统有两个重要的作用:通过资源管理提高计算机系统的效率;改善人机界面向用户提供友好的工作环境。操......
  • Java的心脏:深入解析Java虚拟机、进程与线程的精妙互动
    一、定义进程(Process)和线程(Thread)是操作系统中非常基础且重要的概念,它们对于理解程序的执行、资源分配和并发编程至关重要。我将从操作系统(OS)和Java编程语言的角度来详细解释这两个概念。从操作系统的角度进程:定义:进程是操作系统进行资源分配和调度的基本单位。它是一......
  • 描述C语言中的进程和线程之间的区别
    描述C语言中的进程和线程之间的区别在C语言中,进程和线程是两个非常重要的概念,它们在操作系统中各自扮演着独特的角色。理解它们之间的区别对于编写高效、可维护的并发程序至关重要。下面将详细阐述进程和线程在C语言中的区别。首先,我们来探讨进程的概念。进程是操作系统分配......
  • linux进程状态
    目录1.进程状态分类1.1进程状态查看  2.Z(zombie)-僵尸进程 2.1pid 2.2 僵尸进程危害 3. 孤儿进程4.理论4.1运行态 4.2阻塞态(S,D)4.3挂起态 4.4进程的切换1.进程状态分类CPU内存在很多寄存器看看下面的状态在kernel源代码里定义:/**The......